【问题标题】:Javascript - Promises stay as pendingJavascript - 承诺保持未决
【发布时间】:2016-03-28 07:06:41
【问题描述】:

为什么我的 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

他们不会挂起,我会得到结果。

【问题讨论】:

    标签: javascript promise es6-promise


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      问题是您正在使用then 单独处理每个承诺的履行,而all 通过向其传递一组未解决 承诺来处理多个承诺的履行。它用所有这些共同的结果建立了一个新的承诺。只需使用:

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

      【讨论】:

        【解决方案3】:

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

        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);
        });
        

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

        【讨论】:

        • 第一个给出相同的输出,第二个甚至没有到达下一次执行,无法获得输出。
        • 你是什么意思“相同的输出”?
        • 我在问题中提到的一个。 //[ [ Promise { }, Promise { } ], [ Promise { }, Promise { } ] ]
        猜你喜欢
        • 1970-01-01
        • 2020-03-16
        • 1970-01-01
        • 2020-10-22
        • 2014-12-15
        • 2018-06-11
        • 2022-07-19
        • 2023-03-26
        • 1970-01-01
        相关资源
        最近更新 更多