【发布时间】:2016-05-26 14:14:40
【问题描述】:
我对整个承诺业务很陌生,正在与他们一起尝试我的项目。
不,我需要查询一个外部 API,在响应中执行几个项目,用它们对我自己的数据库进行其他检查,当所有这些都完成后,需要自己解决整个承诺。
我还需要在标记点再次调用我的数据库并做出另一个承诺。这些是相互独立的,但“父”承诺只有在两者都解决时才会解决。
我在这里遇到了困难,可能需要一些关于将多个承诺与多个项目链接起来的一般解释。
也许我只是在这里理解了一些普遍错误的东西......
到目前为止,这是我的代码(缩写为 ...):
'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);
});
});
}
};
【问题讨论】:
-
将您的问题隐藏在代码中的 cmets 内无济于事...您还使用了典型的承诺“反模式”,即在您的循环中创建一个新的承诺已经创建了一个承诺的函数。
-
这些本来应该是一个补充,但我要改变它
-
首先,避免
Promiseconstructor antipattern。你的函数已经返回了 Promise。 -
听起来你在找
Promise.all([onePromise, otherIndependentPromise]).then(whenBothAreDone) -
@Kageetai 是您希望 inside 循环的两个调用吗?
标签: javascript node.js api promise