javascript - 使用过滤器返回 Promise.all 的 promise 数组不起作用

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

我有一个对象数组,我为每个对象执行一个 promise 。然后,如果一切都解决了,我希望在 Promise.all 中获得 .then 调用。问题是,在下面的示例中我只得到输出

All done in approach 2

我认为以下代码非常具有解释性,但简而言之,我正在做的是:

  1. 将 3 个对象声明为 vals,我想根据每个对象创建一个 Promise。
  2. 方法 1:使用 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"));

我正在使用带有 ES6(原生 Promises)的 Node 8.9.1。

最佳答案

你有两个小错误,这些错误使作品变得困惑且令人困惑。

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

然后,两者都不起作用的原因是您创建 promise 的方式。您将 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"));

关于javascript - 使用过滤器返回 Promise.all 的 promise 数组不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47574701/

相关文章:

javascript - HTML jQuery 平滑滚动到元素并添加类

node.js - 无服务器应用程序的结构

node.js - Node/Express - 保护客户端/服务器之间通信的好方法

reactjs - 在 react 中获取图像的确切宽度和高度

javascript - JavaScript 函数报告的平均值不准确

javascript - 如何收集选中的单选按钮并放入数组中然后发布到 Controller

javascript - Meteor 中带有嵌套 #each 的动态循环?

javascript - Jquery tablesorter 通过两个字段进行排序

node.js - 如何无条件地从MongoDB中的数组中提取所有元素

javascript - .ejs 模板中图像的 Webpack 文件/图像加载器