【问题标题】:How to make promise wait till all requests in a loop are completed? [duplicate]如何让承诺等到循环中的所有请求都完成? [复制]
【发布时间】:2020-12-02 04:32:48
【问题描述】:

在项目中我使用 React+redux+fetch。我需要更新 15 个用户,为了更新他们,我发送带有用户 ID 的请求。在 api 方面,我有限制 - 每个请求可以更新 10 个用户,所以我需要发出 2 个请求才能更新所有用户。在第一个请求中,我在第二个 5 个 ID 中发送 10 个 ID。用户更新后,我需要请求用户列表才能更新页面上的用户信息。我履行诺言:

let promise = new Promise(resolve => resolve(1));
let _this = this;
promise
                .then(() => {
                    let preparedIds = DataHelper.getArrayOfArrays(userIds, 10) ;
                   
                            for (let i = 1; i<preparedIds.length; i++) {
                                _this.props.dispatch(requestMeasurePermissions(preparedIds[i]))
                            }
                })
                .then(() => {
                    _this.props.dispatch(getUsersList())

                })

服务方式:

export function getArrayOfArrays(initialArray, subarraySize) {
    let subArrays = [];

    for (let i = 0; i<Math.ceil(initialArray.length/subarraySize); i++) {
        subArrays[i] = initialArray.slice((i*subarraySize), (i*subarraySize) + subarraySize)
    }

    return subArrays;
}

所以我需要在 for 循环中完成所有请求,然后才能转到下一个 .then(),但我的代码在第一次循环迭代后不能作为 _this.props.dispatch(getUsersList()) 'fires' 工作,因此我接收用户列表,其中 10 个用户已更新但另外 5 个未更新。我如何保证等待循环中的所有请求都执行完毕?

【问题讨论】:

  • 您需要从第一个 then() 回调中返回一个承诺才能等待。 dispatch() 是否返回承诺?如果是这样,将它们收集在一个数组中并将它们传递给Promise.all() 然后返回结果承诺。
  • 如果我错了,请原谅我,但如果 Promise 除了 Promise(resolve =&gt; resolve(1)) 之外不执行任何任务,它有什么用?我是JSnoob,但我可以告诉你,如果你创建一个函数来完成所有工作并返回一个值然后将其传递给Promise,那么这段代码可以更好地工作......另外,如果你想要一个承诺等待你最好使用Promise.all,它会等到所有任务完成后再返回。
  • @3limin4t0r 是的,你是对的,调度是一个获取,它返回承诺,在使用 .all() 之后我解决了这个问题。您可以将您的评论复制到答案,我将其标记为答案吗?
  • @SamFisher 我无法添加答案,因为该问题被标记为重复。有关更详细的说明,请查看MDN Using Promises - Chaining

标签: javascript redux promise es6-promise


【解决方案1】:

并行异步执行(执行顺序不重要,性能更好):

使用Promise.all

串行异步执行(执行顺序很重要,只有在前一个请求解决后才开始每个请求):

使用for await...of

【讨论】:

    猜你喜欢
    • 2015-04-24
    • 2016-09-09
    • 1970-01-01
    • 1970-01-01
    • 2015-07-17
    • 1970-01-01
    • 1970-01-01
    • 2017-07-04
    • 2017-09-07
    相关资源
    最近更新 更多