【问题标题】:Returning an array of promises for Promise.all using filter not working使用过滤器返回 Promise.all 的一组承诺不起作用
【发布时间】:2017-11-30 13:31:56
【问题描述】:

我有一个对象数组,并为每个对象执行一个承诺。然后,如果一切都解决了,我希望在Promise.all 中接到.then 的电话。问题是在下面的例子中我只得到输出

所有方法都在方法 2 中完成

我认为下面的代码几乎可以解释,但简而言之,我正在做的是:

  1. 将 3 个对象声明为 vals,我想基于每个对象创建一个 Promise。
  2. 方法一:使用vals.map获取基于vals的promise数组
  3. 方法 2:使用 for 遍历 vals,并在每次迭代中推送一个新的 Promise。

这段代码有什么问题,为什么它只适用于方法 2?

#!/usr/bin/env node

let vals = [
    {
        name: "name1"
    },
    {
        name: "name2"
    },
    {
        name: "name3"
    }
];

function newPromise(obj) {
    return new Promise((resolve) => Promise.resolve(obj.name))
}

/**
 * Approach 1: use .map function to get an array of promises
 */

let promises = vals.map((item) => newPromise(item));
Promise.all(promises)
    .then(() => console.log("All done in approach 1"))
    .catch(() => console.log("Error in approach 1"));

/**
 * Approach 2: iterate through vals using a for an push a new promise for the promises array
 */

let promises2 = [];
for (let i = 0 ; i < vals.length; i++) {
    promises.push(newPromise(vals[i]));
}
Promise.all(promises2)
    .then(() => console.log("All done in approach 2"))
    .catch(() => console.log("Error in approach 2"));

我正在使用节点 8.9.1 和 ES6(原生 Promises)。

【问题讨论】:

    标签: javascript node.js ecmascript-6 promise es6-promise


    【解决方案1】:

    您有两个小错误,它们使作品变得混乱并令人困惑。

    首先,您的第二种方法不应该起作用,因为您不小心将其推送到promises 以进行第二种方法而不是promises2,因此您正在使用Promise.all()一个空数组,这就是它起作用的原因。

    然后,两者都不起作用的原因是您创建承诺的方式。您将Promise.resolve() 嵌套在new Promise() 中,这是行不通的。你可以使用:

    return new Promise(resolve => resolve(obj.name));
    

    return Promise.resolve(obj.name);
    

    这些是等价的。将它们放入其中后,您从未在 new Promise() 中调用过正确的 resolve() 函数,因此实际上没有解决任何问题。

    let vals = [
        {
            name: "name1"
        },
        {
            name: "name2"
        },
        {
            name: "name3"
        }
    ];
    
    function newPromise(obj) {
        return new Promise((resolve) => resolve(obj.name))
    }
    
    /**
     * Approach 1: use .map function to get an array of promises
     */
    
    let promises = vals.map((item) => newPromise(item));
    Promise.all(promises)
        .then(() => console.log("All done in approach 1"))
        .catch(() => console.log("Error in approach 1"));
    
    /**
     * Approach 2: iterate through vals using a for an push a new promise for the promises array
     */
    
    let promises2 = [];
    for (let i = 0 ; i < vals.length; i++) {
        promises2.push(newPromise(vals[i]));
    }
    Promise.all(promises2)
        .then(() => console.log("All done in approach 2"))
        .catch(() => console.log("Error in approach 2"));

    【讨论】:

    • omg... 我不敢相信即使在这个小演示中我也错过了这些细节!谢谢!这完全是我的烂摊子......
    【解决方案2】:

    您的newPromise 函数有问题。尝试删除Promise.

    对于第二种方法,您还必须推送正确的数组:promises2

    let vals = [
        {
            name: "name1"
        },
        {
            name: "name2"
        },
        {
            name: "name3"
        }
    ];
    
    function newPromise(obj) {
        return new Promise((resolve) => resolve(obj.name))
    }
    
    /**
     * Approach 1: use .map function to get an array of promises
     */
    
    let promises = vals.map((item) => newPromise(item));
    Promise.all(promises)
        .then(() => console.log("All done in approach 1"))
        .catch(() => console.log("Error in approach 1"));
    
    /**
     * Approach 2: iterate through vals using a for an push a new promise for the promises array
     */
    
    let promises2 = [];
    for (let i = 0 ; i < vals.length; i++) {
        promises2.push(newPromise(vals[i]));
    }
    Promise.all(promises2)
        .then(() => console.log("All done in approach 2"))
        .catch(() => console.log("Error in approach 2"));

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-26
      • 1970-01-01
      • 2017-05-17
      • 1970-01-01
      • 2016-11-25
      相关资源
      最近更新 更多