我使用request-promise
节点模块如下:
let rp = require('request-promise');
我有以下承诺链:
getData().then( data => {
return getUser(data);
})
.then( data => {
return getProfiles(data);
}).then( data => {
updateAddresses(data);
});
updateAddresses
如下:
function updateAddresses(data){
var promises = data.map( (aProfile) => {
var options = {url:'http://example.com', method:'POST'};
return rp(options);
});
// Promise.all(promises).then(...);
}
所以我正在为数组的每个元素准备一个promise(request-promise)。
问题是,即使我删除了Promise.all
!
怎么可能?我怎么能许诺不解雇?
问候。
答案 0 :(得分:1)
您的updateAddresses
未发送任何内容以致电then()
,而您并未等待updateAddress
的内容。
function updateAddresses(data){
var promises = data.map( (aProfile) => {
var options = {url:'http://example.com', method:'POST'};
return rp(options);
});
//Return something to then()
return Promise.all(promises).then(...);
}
然后等待它:
getData().then( data => {
return getUser(data);
})
.then( data => {
return getProfiles(data);
}).then( data => {
return updateAddresses(data);
}).then(e => somethingelse);
根据您的要求存储map
ped地址对象:
function updateAddresses(data) {
return data.map((aProfile) => {
return {
url: 'http://example.com',
method: 'POST'
}
});
}
getData()
.then(data => getUser(data))
.then(data => getProfiles(data))
.then((data) => {
let addressOptions = updateAddresses(data);
/*
* You now have an Array of Objects of the form:
* {
* url: "",
* method: "",
* }
*/
return Promise.resolve(addressOptions);
})
.then(addressOptions => Promise.all(addressOptions.map(address => rp(address))))
.then((arrayOfResolvedData) => {
/*
* arrayOfResolvedData is an Array of data per whatever rp() returns
* probably Response Objects
*/
console.log(arrayOfResolvedData);
})
答案 1 :(得分:1)
你可以做他在编辑中建议的零点。
主要问题是您将数据映射到实际的承诺,而不是准备执行承诺的东西,
比较
Let promises = Options.map(option => execute(option))
Promise.all(promises)
用
Let promiseGenerators =Options.map(option => () => execute(option))
Promise.all(promiseGenerators.map(generator => generator())
第二个你调用将返回promise的函数,它将开始执行它。这就是问题所在,因为你太快就调用了rp(选项)。