【发布时间】:2019-08-17 14:49:11
【问题描述】:
我正在开发一个 API 调用链,这些调用链通过调用带有 id 数组的 api、获取数据返回,然后在检索到一些数据的情况下对不同的端点进行下一次调用。
现在这完全是一个幼稚的解决方案 - 我希望获得一些关于如何最好地优化它的信息。我可能有大约 500 个数据点要处理。
从apiHelper.apiCall(data, endpoint) 返回的是一组 promise,每次都在 Promise.all(); 中解析和管理 - 含义
目前它看起来像 6 个嵌套的 Promise.all() 相互之间的 .then():
Promise.all(function(){})
.then(function(){
Promise.all(function(){})
.then(function(){
Promise.all(function(){})
.then(function(){
Promise.all(function(){})
.then(function(){
...and so on...
});
});
});
});
即半实数代码。
var datapoints = req.body.toString().split("\n");
var startingCount = datapoints.length;
var preFailed = [];
//initial naïve solution with nested Promise.all();
var promises = apiHelper.apiCall(datapoints, endpoint + '?referenceId=');
console.log('#INITIAL COUNT', promises.length);
Promise
.all(promises)
.then(function (orderItems) {
var itemHrefs = [];
orderItems.forEach(function (oi) {
if (oi.data.items && oi.data.items.length > 0) {
itemHrefs.push(oi.data.items[0].href); //get item href (has full order ref)
}
})
//Find order items
promises = apiHelper.apiCall(itemHrefs, '');
Promise
.all(promises)
.then(function (retrievedOrders) {
var consumerOrderHrefs = [];
retrievedOrders.forEach(function (ro) {
if (ro.data.consumers) {
consumerOrderHrefs.push(ro.data.consumers.href); //get item href (has full order ref)
}
})
promises = apiHelper.apiCall(consumerOrderHrefs, '');
console.log('#STEP 3 FIND CONSUMERORDER COUNT', promises.length);
Promise
.all(promises)
.then(function (retrievedConsumers) {
var consumerHrefs = [];
retrievedConsumers.forEach(function (c) {
if (c.data.items[0]) {
consumerHrefs.push(c.data.items[0].href); //get item href (has full order ref)
}
})
promises = apiHelper.apiCall(consumerHrefs, '');
console.log('#STEP 4 FIND CONSUMER COUNT', promises.length);
Promise
.all(promises)
.then(function (consumer) {
var guestHrefs = [];
consumer.forEach(function (c) {
if (c.data.guest.href) {
guestHrefs.push(c.data.guest.href); //get item href (has full order ref)
}
})
promises = apiHelper.apiCall(guestHrefs, '');
console.log('#STEP 5 GUEST COUNT', promises.length);
Promise
.all(promises)
.then(function (guests) {
var guest = [];
guests.forEach(function (g) {
if (g.data) {
guest.push(g.data); //get item href (has full order ref)
}
})
res.status(200).json({guest});
})
.catch(function (err) {
console.log('#ERR', err);
res.status(500).send(err);
});
})
.catch(function (err) {
console.log('#ERR', err);
res.status(500).send(err);
});
})
.catch(function (err) {
console.log('#ERR', err);
res.status(500).send(err);
});
})
.catch(function (err) {
console.log('#ERR', err);
res.status(500).send(err);
});
})
.catch(function (err) {
console.log('#ERR', err);
res.status(500).send(err);
});
【问题讨论】:
标签: javascript node.js ecmascript-6 promise