Javascript - 承诺保持待定状态

时间:2016-03-27 22:42:54

标签: javascript promise es6-promise

为什么我的承诺会处于待定状态,我该如何解决呢?

    var foundPeopleA = findPeopleA().then(function(result) {
        var res = []
        result.map(function(el) {
            res.push(getProfileXML(el.sid));
        });
        return res
    });

    var foundPeopleB = findPeopleB().then(function(result) {
        var res = []
        result.map(function(el) {
            res.push(getProfileXML(el.sid));
        });
        return res
    })

    return Promise.all([findPeopleA, findPeopleB]).then(function(results) {
        console.log(results) //[ [ Promise { <pending> }, Promise { <pending> } ],  [ Promise { <pending> }, Promise { <pending> } ] ]
    })

但是,如果我将上述2个函数的主体更改为

        var res
        result.map(function(el) {
            res = getProfileXML(el.sid);
        });
        return res

他们不会等待,我会得到结果。

3 个答案:

答案 0 :(得分:1)

阵列不是承诺。如果你返回一个promises数组,then会得到一个promises数组 - 就像你返回任何其他非promise值一样。只有当您返回承诺时,承诺才会在then之前执行。你的foundPeopleAfoundPeopleB构造了一系列承诺;你需要连接这些数组并将它们传递给Promise.all或同等数据,以便执行它们。

答案 1 :(得分:1)

问题是你使用then分别处理每个承诺的承诺,而all通过传递一个未解决的数组来处理多个承诺的实现承诺。它建立了一个新的承诺,将所有这些结果结合在一起。只需使用:

Promise.all([findPeopleA(), findPeopleB()])
.then(function(responses) ...

答案 2 :(得分:0)

尝试将数组分配给映射的结果。

var foundPeopleA = findPeopleA().then(function(result) {
    var res = []
    res = result.map(function(el) {
        return getProfileXML(el.sid);
    });
    return res
});

或者,也许你可以解决这个承诺?

var foundPeopleA = findPeopleA().then(function(result) {
    var res = []
    res = result.map(function(el) {
        return getProfileXML(el.sid);
    });
    resolve(res);
});

无论哪种方式,我都相信你需要通过从映射返回值来构建你的数组来创建新数组。