【问题标题】:Understanding Promise.all in javascript在 JavaScript 中理解 Promise.all
【发布时间】:2021-09-06 19:29:38
【问题描述】:

我有一个示例代码和问题

'use strict';
const AWS = require('aws-sdk');

const promiseFunction = (item) => {
    const database = new AWS.DynamoDB();
    const params = {
        TableName: 'some-table',
        Item: item
    }

    try {
        //database.putItem(params).promise(); //3
        //Updated as per the comments..
        return database.putItem(params).promise(); //3
    } catch (err) {
        console.log(`Error`);
    }
}

const test = async () => {
    const arr = [];
    try {
        for (let data=1;data<=1000;data++) {
            const obj = { data: {N: data.toString()}} 
            arr.push(promiseFunction(obj)); //1
        }
        const result = await Promise.all(arr); //2
    } catch (e) {
        console.log(`Error`);
    }
}
test();

一些后续问题:

  1. 在第 2 行,一旦所有基于 Promise 的函数在 //1 行执行,结果将包含解析/拒绝结果。对吗?
  2. 如何,第 1 行的 promiseFunction 正在执行并在 dynamodb 中插入项目,因为我只是将其推入数组而不是调用 dynamo putItem API。从技术上讲,所有“putItem”都应该在第 2 行开始并行执行。请在这里帮忙?
  3. 上述代码在 Promise.all 和并行执行插入操作方面是否有效。请指教。

【问题讨论】:

  • promiseFunction(obj) 确实调用函数,无论你是否将该调用的 result 推送到某处,将其分配给变量或忽略它没关系,你调用函数。

标签: javascript es6-promise


【解决方案1】:

在第 2 行,一旦所有基于 Promise 的函数在 //1 行执行,结果将包含解析/拒绝结果。对吧?

一旦arr 中的所有承诺都已履行,result 将被分配。 Promise.all 不知道(或关心)这些承诺是如何创建的。

从技术上讲,所有“putItem”都应该在第 2 行开始并行执行。

没有。所有putItem() 调用都在您的循环中执行。 Promise.all 不执行任何操作,它只等待之前创建的承诺。请求是并发完成的,因为代码一次启动它们,而不是在每次循环迭代之间等待,而不是因为它使用Promise.all

Promise.all和并行执行插入操作而言,上述代码是否有效。

没有。您的promiseFunction 实际上并没有返回承诺,因为您忘记了标记为//3 的行上的return 语句。添加后,代码就可以了。

【讨论】:

  • 感谢@Bergi 的澄清。另外,我不知道为什么这个问题确实有-1。
猜你喜欢
  • 1970-01-01
  • 2020-10-03
  • 2017-01-21
  • 2021-08-21
  • 2021-08-13
  • 1970-01-01
  • 2018-11-11
  • 1970-01-01
  • 2016-01-09
相关资源
最近更新 更多