我有一个问题,试图把我的头脑围绕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);
}
当rp(url)在addApiData()中被调用时,它不会等到函数在我传递给Promise的数组中开始下一个项目之前被解析。映射到process1000()中。只要在addApiData中调用rp(url),就会对数组中的下一项调用addApiData。然后调用process1000中的第二个.then()函数,在Promise.map中所有内容都有机会解析之前过早地调用。我尝试了几个不同的库,使我的GET请求,但他们都有同样的问题。我哪里做错了?任何帮助都将非常感激。
我想你在寻找更像这样的东西:
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构造函数反模式。
换句话说,如果你返回一个promise,你不需要返回then
。
return rp(url).then(function(res) { return res; });
// and
return rp(url);
它们都返回一个承诺(rp(url)
返回一个承诺,rp(url).then( /* ... */)
返回一个承诺)