2015-07-31 18 views
8

Cảm ơn trước sự giúp đỡ.Lời hứa Bluebird - mỗi chức năng

Trong khi sử dụng lời hứa Bluebird, tôi có một loạt lời hứa đang chạy. Trong lời hứa cuối cùng, tôi muốn chạy một hàm nhiều lần cho mỗi đối tượng trong một mảng.

Dưới đó là giả:

var userArray = [ 
    { 
     name: "John", 
     email: "[email protected]" 

    }, 
    { 
     name: "Jane", 
     email: "[email protected]" 
    }]; 

var functionOne = function() { 
    //returns Promsie object 
}; 

var functionTwo = function() { 
    //returns promise object 
}; 

var createUser = function(user) { 
    return User.findOrCreate({email: user.email},{ 
     name: user.name, 
     email: user.email 
    }); 
}; 

functionOne() 
    .then(functionTwo) 
    .each(createUser(userArray)) 
    .then(function onComplete() { 
     console.log("Complete"); 
    }) 
    .catch(function onError() { 
     console.log("Um...it's not working"); 
    }); 

tôi biết tôi không sử dụng mỗi chức năng một cách chính xác. Cách chính xác để thực hiện điều này bằng cách sử dụng Bluebird là gì?

+0

mảng bạn muốn lặp lại với 'mỗi' là gì? Nó được trả về bởi 'functionTwo' hay là' userArray'? – Sosdoc

+0

@Sosdoc Tôi muốn lặp lại trên userArray – Jay

+0

Bạn phải chuyển một hàm gọi lại tới 'mỗi', không phải là lời hứa. – Bergi

Trả lời

2

Cảm ơn @Roman @Yuri vì đã trợ giúp! Mã đang hoạt động của tôi dưới đây:

var userArray = [ 
{ 
    name: "John", 
    email: "[email protected]" 

}, 
{ 
    name: "Jane", 
    email: "[email protected]" 
}]; 

var functionOne = function() { 
    //returns Promise object 
}; 

var functionTwo = function() { 
    //returns Promise object 
}; 

var createUser = function(singleUser) { 
    //returns Promise object containing creating User 
}; 

functionOne() 
    .then(functionTwo) 
    .then(function() { 
     return Promise.map(userArray, createUser); 
    }) 
    .then(function onComplete(response) { 
     console.log("Complete:" + JSON.stringify(response)); 
    }) 
    .catch(function onError() { 
     console.log("Um...it's not working"); 
    }); 
12

Vì tôi hiểu bạn muốn thực hiện một số hành động không đồng bộ cho các phần tử từ mảng. Sau đó, hãy kiểm tra các ví dụ sau:

var Promise = require('bluebird'); 

function createUsersFromArray(userArray){ 
    return Promise.each(userArray, function(signleUser){ 
     return createUserFunction(signleUser); 
    }); 
} 

hoặc

return Promise.each(userArray, createUserFunction); 

functionOne() 
    .then(functionTwo) 
    .then(function(){ 
     return createUsersFromArray(userArray); 
    }) 
//or just .then(createUsersFromArray) if functionTwo return this array 
    .then(function(createdUsers){ 
     //here you may retrieve users and make some magic with them 
     console.log(createdUsers); 
    }) 
    .then(function onComplete() { 
     console.log("Complete"); 
    }) 
    .catch(function onError() { 
     console.log("Um...it's not working"); 
    }); 

tôi cũng khuyên bạn nên sử dụng "tất cả" thay vì "mỗi"

Kiểm tra các ví dụ dưới đây:

return Promise.all(userArray.map(function(singleUser){ 
    return doSomethingWithUser(singleUser); 
})); 

hoặc

return Promise.all(userArray.map(doSomethingWithUser)); 

'tất cả' sẽ thông báo cho bạn nếu tất cả các hành động được thực hiện chính xác.

Làm thế nào để sử dụng những lời hứa (thực hành tốt nhất):

http://pouchdb.com/2015/05/18/we-have-a-problem-with-promises.html https://blog.domenic.me/youre-missing-the-point-of-promises/

+0

Cảm ơn bạn đã trả lời. Trong khối mã thứ hai của bạn, hàm 'createUserFunction' có trả lại một đối tượng Promise hoặc User không? – Jay

+0

@Jay Hàm trả về lời hứa, nhưng bạn có thể truy xuất người dùng nếu hàm trả về những người dùng này. Vì vậy, tôi muốn nói với bạn những điều sau đây. Nếu bạn 'createUsersFromArray' chức năng trở lại/giải quyết tạo người dùng, sau đó bạn có thể lấy hồ sơ này vào các 'rồi' tuyên bố tiếp theo như 'createUsersFromArray (userArray) .Sau đó (function (createdUser) { console.log (createdUser) }); ' Tôi cũng đã cập nhật câu trả lời của mình, vui lòng kiểm tra hàm trước' onComplete ' –

5

Việc thực hiện đơn giản nhất:

functionOne() 
    .then(functionTwo) 
    .then(function(){ 
     return bluebird.each(userArray, createUser); 
    }) 
    .then(function onComplete() { 
     console.log("Complete"); 
    }) 
    .catch(function onError() { 
     console.log("Um...it's not working"); 
    }); 

Bạn nên sử dụng .map thay vì .each nếu bạn muốn truy cập kết quả của tất cả những điều đó tạo ra.

Các vấn đề liên quan