我在尝试围绕 JavaScript promises 思考时遇到了问题。这是我最近的挫败感:
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。然后调用 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);
}
这里的要点是您需要确保返回 promise,否则下一个then
将不知道如何处理它的值。
另外,尽量避免 Promise constructor antipattern .
换句话说,如果你返回一个 promise,你也不需要返回 then
。
这两个是等价的:
return rp(url).then(function(res) { return res; });
// and
return rp(url);
它们都返回一个 promise (rp(url)
返回一个 promise ,而 rp(url).then(/* ... */)
返回一个 promise ).
关于javascript - Promise.map 在继续 .then() 之前不等待解决,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33051069/