【发布时间】: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 => resolve(1))之外不执行任何任务,它有什么用?我是JSnoob,但我可以告诉你,如果你创建一个函数来完成所有工作并返回一个值然后将其传递给Promise,那么这段代码可以更好地工作......另外,如果你想要一个承诺等待你最好使用Promise.all,它会等到所有任务完成后再返回。 -
@3limin4t0r 是的,你是对的,调度是一个获取,它返回承诺,在使用 .all() 之后我解决了这个问题。您可以将您的评论复制到答案,我将其标记为答案吗?
-
@SamFisher 我无法添加答案,因为该问题被标记为重复。有关更详细的说明,请查看MDN Using Promises - Chaining
标签: javascript redux promise es6-promise