Promise.then()之后的Promise.all()返回未定义的值

时间:2016-12-06 23:21:09

标签: javascript promise

我有以下代码

var pOne = new Promise(function(callback){
    setTimeout(function(){
        callback(false);
    }, 100);
}).then(function(v){
    console.log("pOne: " + v);
});

var pTwo = new Promise(function(callback){
    setTimeout(function(){
        callback(true);
    }, 100);
}).then(function(v){
    console.log("pTwo: " + v);
});

Promise.all([pOne, pTwo]).then(function(values){
    console.log(values);
});

console.log(values)在控制台中显示[undefined, undefined]。我对承诺的理解是我应该能够链接then()方法。链接不适用于Promise.all()或者这是一个错误。

注意:我使用promise-polyfill但是在chrome上运行它,所以从技术上讲,它使用的是promises的原生chrome实现。

2 个答案:

答案 0 :(得分:3)

你的pOne和pTwo承诺不会退货。

试试这个:

var pOne = new Promise(function(callback){
    setTimeout(callback, 100, true);
}).then(function(v){
    return v;
});

var pTwo = new Promise(function(callback){
    setTimeout(callback, 100, false);
}).then(function(v){
    return v;
});

Promise.all([pOne, pTwo]).then(function(values){
    console.log(values);
});

答案 1 :(得分:1)

pOnepTwo必须解决一个值才能将该值传递给Promise.all的结果。

var pOne = new Promise(function(callback){
    setTimeout(function(){
        callback(false);
    }, 100);
}).then(function(v){
    console.log("pOne: " + v);
    return v;
});

请注意return v回调中的.then。这意味着pOne承诺将使用该值解决v在这种情况下是先前Promise解决的任何内容,或者在这种情况下{{1} }。

现在为false承诺做同样的事情。

pTwo

同样,我们必须从var pTwo = new Promise(function(callback){ setTimeout(function(){ callback(true); }, 100); }).then(function(v){ console.log("pTwo: " + v); return v; }); 回调函数返回一个值,以便Promise使用值解析,而不是使用undefined。

现在,.then将运行Promises,当他们(或者如果)他们解决时(在我们的情况下他们总是这样做),它会得到解决每个值的值,Promise.all承诺本身将使用值解决