我如何获得蓝鸟Promise.settle()的承诺值?

时间:2015-08-26 20:35:13

标签: javascript promise bluebird

当我使用Promise.map()时,我得到一个user_ids数组或一个错误。当我使用Promise.settle()时,我得到数组的值,而不是数组中返回的promises中的值。我正在使用以下内容来更好地说明我的意思:

var Promise = require('bluebird');
var user_names = ['John','Mary'];

Promise.map(user_names, function(name){
    //following will return a promise resolved with the db id
    // or a rejection
    return db.create(name);
}).then(function(user_ids){
    //if db.create never failed I get an array of db ids
    console.log(user_ids); //returns ['1','2']
}).catch(function(err){
    //at least one of the db.create() failed
});

Promise.settle(user_names, function(name){
    //following will return a promise resolved with the db id
    // or a rejection
    return db.create(name);
}).then(function(results){
    //I get an array of PromiseInspection objects
    if(results[0].isFulfilled()){
        var value = results[0].value();
        console.log(value); //returns 'John'
    }
});

我的最终目标是找回一系列ID。由于承诺被拒绝,该数组可能小于数组user_names

1 个答案:

答案 0 :(得分:1)

Promise.settle的确有效Promise.all,与Promise.map不同。它不接受一个值数组和一个回调,它确实需要一组promises(如果给定值,它会将它们解析为promises)。你的回调被忽略了。

您将使用Array's .map method

自行调用此函数
Promise.settle(user_names.map(function(name) {
//                       ^^^^^
    return db.create(name);
})).then(function(results) {
    if (results[0].isFulfilled()) {
        var value = results[0].value();
        console.log(value); // returns the database id now
    }
});