Promise.map 在继续 .then() 之前不等待解决
Promise.map not waiting for resolution before proceeding to .then()
我在思考 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) 时,它不会等到函数解析后才开始传递给 Promise.map 的数组中的下一项在进程 1000() 中。一旦在 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);
}
这里的要点是你需要确保你return正在承诺,否则下一个then
不会知道如何处理它的价值。
此外,请尽量避免 Promise constructor antipattern。
换句话说,如果你return一个承诺,你也不需要returnthen
。
这两个是等价的:
return rp(url).then(function(res) { return res; });
// and
return rp(url);
他们都return一个承诺(rp(url)
return一个承诺,rp(url).then( /* ... */)
return一个承诺)。
我在思考 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) 时,它不会等到函数解析后才开始传递给 Promise.map 的数组中的下一项在进程 1000() 中。一旦在 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);
}
这里的要点是你需要确保你return正在承诺,否则下一个then
不会知道如何处理它的价值。
此外,请尽量避免 Promise constructor antipattern。
换句话说,如果你return一个承诺,你也不需要returnthen
。
这两个是等价的:
return rp(url).then(function(res) { return res; });
// and
return rp(url);
他们都return一个承诺(rp(url)
return一个承诺,rp(url).then( /* ... */)
return一个承诺)。