我对整个 Promise 业务还很陌生,正在与他们一起尝试我的项目。
不,我需要查询外部 API,在响应中查找多个项目,用它们对我自己的数据库进行其他检查,当所有这些都完成后,需要自行解决整个 promise 。
我还需要在标记点再次调用我的数据库并做出另一个 promise 。它们是相互独立的,但“父” promise 只有在两者都得到解决时才应得到解决。
我在这里一堵墙,可能需要一些关于将多个 promise 与多个项目链接起来的一般性解释。
也许我只是理解这里普遍错误的东西......
这是到目前为止我的代码(缩短为...):
'use strict';
import rp from 'request-promise';
import _ from 'lodash';
var Import = {
init: function(user, options) {
return new Promise((resolve, reject) => {
rp.get("...") // call to external API
.then((res) => {
...
resolve();
});
...
});
},
run: function() {
return new Promise((resolve, reject) => {
...
rp.get(...) // call to external API
.then((res) => {
var events = JSON.parse(res).data;
var promises = [];
for (var i = 0; i < events.length; i++) {
promises.push(new Promise((resolve, reject) => {
...
Location.findOneAndUpdateAsync(...)
.then((loc) => {
events[i].location = loc._id;
resolve();
})
.catch((err) => {
console.error(err);
reject();
});
// I need even another call to my database here later with another promise
}));
}
return Promise.all(promises)
.then(() => {
console.log("all promises resolved");
resolve(events);
});
})
.catch((err) => {
console.error(err);
reject(err);
});
});
}
};
最佳答案
您可以通过不违反Promise constructor anti-pattern来极大地简化您的代码。 - 您调用的函数已经返回 promise ,因此您应该利用这些。
然后,使用 Array.prototype.map
消除 for
/push
循环:
var promises = events.map(function(event) {
return Location.findOneAndUpdateAsync(...)
.then((loc) => event.location = loc._id);
});
您说过要进行两组调用,但由于它们是独立的,您不妨使用另一个 .map
调用:
var promises2 = events.map(function(event) {
return ...
});
然后您只需等待所有这些并返回您的 events
对象:
return Promise.all(promises.concat(promises2)).then(() => events);
不需要所有这些 .catch
block - 您应该让错误向上传播。
如果(根据您的评论)两个内部调用具有依赖性,您可以尝试以下操作:
var promises = events.map(function(event) {
return Location.findOneAndUpdateAsync(...)
.then((loc) => {
event.location = loc._id;
if (condition) {
return XXXOtherFunctionReturningPromise();
}
});
});
[显然,然后消除上面的 .concat
调用]
关于javascript - 具有 API 和数据库查询的 Node.js Promise Chain,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35413269/