我有以下API调用,该API调用应返回每个ID的数据,但是对于v2,它不返回有关每个订单的信息,而是仅显示其中一个ID。有趣的是,所有订单都显示在控制台日志中。
app.get("/all", function (req, res) {
api.get("/v3/orders/refunds")
.then((response) => {
// console.log(response.data[0].order_id)
// console.log(response)
for (var i = 0; i < response.data.length; i++) {
// console.log(response.data[i].order_id)
let ids = response.data[i].order_id;
// console.log(ids)
api.get(`/v2/orders/${ids}`)
.then((refundedOrders) => {
bothResponses = {
v3: response,
v2: refundedOrders
}
console.log(bothResponses)
res.status(200).json(bothResponses)
})
}
})
.catch((err) => {
console.log(err)
})
})
答案 0 :(得分:2)
您已经创建了一个for
循环来遍历各种订单,但是在该for
循环中,您调用:
res.status(200).json(bothResponses)
每个请求只能得到一个响应,因此,在for
循环的第一次迭代中调用该响应时,将不会再为该请求发送其他响应。在res.json()
循环中对for
的后续调用将被忽略。实际上,他们应该已经向控制台输出了有关“已发送标题”或类似信息的警告。
相反,您需要将所有id的结果累加到一个数组中,然后发送一个包含所有数据的响应。
您可以使用Promise.all()
将所有订单累积到一个数组中,并在完成以下操作时通知您:
app.get("/all", function(req, res) {
api.get("/v3/orders/refunds").then((response) => {
// console.log(response.data[0].order_id)
// console.log(response)
return Promise.all(response.data.map(item => {
return api.get(`/v2/orders/${item.order_id}`);
})).then(refundedOrders => {
let bothResponses = {
v3: response,
v2: refundedOrders
}
console.log(bothResponses);
res.json(bothResponses);
});
}).catch((err) => {
console.log(err);
res.sendStaus(500);
})
});
改进列表:
.map()
迭代数组。返回数组中每个项目的承诺。Promise.all()
来监视promise数组并将其转换为有序结果数组。.status(200)
,因为它已经是默认设置,所以没有必要。.catch()
也会捕获到这些第二个API调用错误)。