我试图围绕JavaScript承诺解决问题。这是我最近的挫折:
var rp = require('request-promise');
function process1000() {
//gets 1000 objects from DB to process
get1000objects()
.then(function (docs) {
Promise.map(docs, addApiData)
})
.then(function (objects) {
console.log(objects)
})
}
function addApiData(element) {
return rp(url).then(function (res) {
resolve(res);
})
.catch(console.error);
}
当在addApiData()中调用rp(url)时,它不会等到函数解析之后再开始我在process1000()中传递给Promise.map的数组中的下一个项目。只要在addApiData中调用rp(url),就会在数组中的下一个项目上调用addApiData。然后在进程中有一个机会在Promise.map中解析之前过早地调用process1000中的第二个.then()函数。我已经尝试了几个不同的库来提出我的GET请求,但他们都有同样的问题。我在这做错了什么?任何帮助将不胜感激。
答案 0 :(得分:3)
我认为你正在寻找更像这样的东西:
var rp = require('request-promise');
function process1000() {
//gets 1000 objects from DB to process
get1000objects()
.then(function (docs) {
return Promise.map(docs, addApiData)
})
.then(function (objects) {
console.log(objects);
})
}
function addApiData(element) {
return rp(url)
.catch(console.error);
}
这里的要点是,您需要确保返回承诺,否则下一个then
将不知道如何处理其值。
另外,请尽量避免使用Promise constructor antipattern。
换句话说,如果您退回承诺,则无需返回then
。
这两个是等价的:
return rp(url).then(function(res) { return res; });
// and
return rp(url);
他们都返回一个承诺(rp(url)
返回一个承诺,rp(url).then( /* ... */)
返回一个承诺。