gpt4 book ai didi

javascript - 使用 Promise.all 执行数组中的 promise 会破坏它们

转载 作者:行者123 更新时间:2023-11-29 20:52:47 26 4
gpt4 key购买 nike

我有一个 userId 数组,我在 getOrdersByUserId() 中使用它们来获取这些用户在特定月份所下的订单:

function getOrdersByUserId(userId, month = 4) {
const apiService = new ApiService();

return apiService.getOrdersList(`?OrderingUser=${userId}`)
.then(orders => {
const monthOrders = orders.filter(order => new Date(order.FromTime)
.getMonth() === month);

return monthOrders;
});
}

这是 ApiService 中的 getOrdersList():

getOrdersList(queryString = '') {
return httpsRequest.createRequest(this.URL.ordersList + queryString, {}, this.requestHeaders, 'GET')
.then(result => JSON.parse(result).Records);
}

httpsRequest.createRequest 返回一个通过 API 响应解决的 promise (如有必要,我也可以共享该代码)。

当我用我拥有的 8 个用户 ID 测试 getOrdersByUserId() 时,我每次都得到正确的记录。当我将这些调用放入一个 promise 链并使用 Promise.All() 执行它们时,就会中断。我在这个答案的帮助下写了下面的代码:Wait for forEach with a promise inside to finish

const promises = userIds.map(userId => {
return getOrdersByUserId(userId, month)
.then(orders => {
return orders;
});
});

Promise.all(promises).then(results => {
console.log(results);
}).catch(err => {
console.log(err);
});

使用 8 个 userId 进行测试时,我收到此错误四到五次:

(node:1) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): SyntaxError: Unexpected end of JSON input

经过大量控制台日志记录后,似乎当 httpsRequest.createRequest() 给出的结果是空字符串而不是来自 API 的 JSON 响应时会发生此错误。那么,为什么所有这些具有相同 userId 的调用都会单独运行,但在 promise 链中执行时会中断呢?我该如何解决这个问题?

最佳答案

您有一个常见的误解:您不执行 promise 。 Promise.all 不“运行”任何东西。 promise 只是一种观察操作以了解操作何时完成以及操作成功还是失败的方法。

在您的例子中,操作由 apiService.getOrdersList 启动,只要您调用它。

你所看到的表明

  1. API 服务不喜欢您同时向它发送八个请求(可能是速率限制),并且

  2. 来自 API 服务的 promise 使用一个无效的 JSON 值来解析,而不是在无法处理 #1 时拒绝(不幸的是,它应该拒绝,而不是解析)。

使用 Promise.all 不会破坏这些操作。但显然,在并行中断中运行其中的八个操作。

您可以连续运行它们(一个接一个):

userIds.reduce((p, userId, index) => {
return p.then(results => {
return getOrdersByUserId(userId, month)
.then(orders => {
results[index] = orders;
return results;
});
});
}, Promise.resolve([]))
.then(results => {
// `results` is an array of results, in the same order as `userIds`
})
.catch(err => {
console.log(err);
});

每次调用 getOrdersByUserId 都会等待前一个调用完成;最终结果是一个结果数组,其顺序与 userIds 数组相同。

关于javascript - 使用 Promise.all 执行数组中的 promise 会破坏它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50950680/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com