NodeJS - 从 Promise.all 函数返回值时获取 'undefined'
NodeJS - Getting 'undefined' while returning values from Promise.all function
我有以下代码:
var Promise = require('bluebird');
var reqP = Promise.promisifyAll(require('request-promise'));
var requestsArray = [];
function getRequests(){
const req1 = {
method: 'GET',
uri: 'url'
}
const req2 = {
method: 'GET',
uri: 'url'
}
const req3 = {
method: 'GET',
uri: 'url'
}
const req4 = {
method: 'GET',
uri: 'url'
}
const req5 = {
method: 'GET',
uri: 'url'
}
const req6 = {
method: 'GET',
uri: 'url'
}
const req7 = {
method: 'GET',
uri: 'url'
}
Promise.all([reqP(req1), reqP(req2), reqP(req3),
reqP(req4), reqP(req5), reqP(req6),
reqP(req7)])
.then(function (results) {
for(re in results){
switch(re){
case '0':
requestsArray.push({'req1':{'value':JSON.parse(results[re])}})
break;
case '1':
requestsArray.push({'req2':{'value':JSON.parse(results[re])}})
break;
case '2':
requestsArray.push({'req3':{'value':JSON.parse(results[re])}})
break;
case '3':
requestsArray.push({'req4':{'value':JSON.parse(results[re])}})
break;
case '4':
requestsArray.push({'req5':{'value':JSON.parse(results[re])}})
break;
case '5':
requestsArray.push({'req6':{'value':JSON.parse(results[re])}})
break;
case '6':
requestsArray.push({'req7':{'value':JSON.parse(results[re])}})
break;
}
}
return requestsArray;
})
.catch(function (err) {
console.log('Error: ', err);
})
}
module.exports = {getExampleFile};
return requests Array
返回空(或未定义),因为 if 运行时没有等待 for 循环完成。
我怎样才能让它等待 for 循环完成,因为在这种情况下它已经嵌套在 .then() 中?
我经历了很多选择,从 Promises 开始,使用另一个将在第 6 次迭代时调用的函数,然后遍历 async await。
一直在玩弄它,但仍然不完全确定如何在这种情况下实施每一个建议的解决方案。
谢谢。
我上面的评论是:return Promise.all(....
.
生成您想要的结构的更漂亮的方法是为每个异步调用创建一个承诺,该调用将请求参数作为输入并将请求的结果写回到同一个对象(将其视为待办事项列表),像这样:
function getRequests(){
const req1 = {
method: 'GET',
uri: 'url'
}
const req2 = {
method: 'GET',
uri: 'url'
}
// etc.
let todoList = [{ request:req1 }, { request:req2 }, ...];
let promises = todoList.map(item => {
return reqP(item.request).then(result => {
item.value = JSON.parse(result);
return item;
});
});
return Promise.all(promises);
}
这个想法是 return 承诺在履行时将请求结果与请求相关联。 getRequests()
将 return 承诺解析为:
[{ request:req1, value:/* json parsed result */}, {...}, ...},
我有以下代码:
var Promise = require('bluebird');
var reqP = Promise.promisifyAll(require('request-promise'));
var requestsArray = [];
function getRequests(){
const req1 = {
method: 'GET',
uri: 'url'
}
const req2 = {
method: 'GET',
uri: 'url'
}
const req3 = {
method: 'GET',
uri: 'url'
}
const req4 = {
method: 'GET',
uri: 'url'
}
const req5 = {
method: 'GET',
uri: 'url'
}
const req6 = {
method: 'GET',
uri: 'url'
}
const req7 = {
method: 'GET',
uri: 'url'
}
Promise.all([reqP(req1), reqP(req2), reqP(req3),
reqP(req4), reqP(req5), reqP(req6),
reqP(req7)])
.then(function (results) {
for(re in results){
switch(re){
case '0':
requestsArray.push({'req1':{'value':JSON.parse(results[re])}})
break;
case '1':
requestsArray.push({'req2':{'value':JSON.parse(results[re])}})
break;
case '2':
requestsArray.push({'req3':{'value':JSON.parse(results[re])}})
break;
case '3':
requestsArray.push({'req4':{'value':JSON.parse(results[re])}})
break;
case '4':
requestsArray.push({'req5':{'value':JSON.parse(results[re])}})
break;
case '5':
requestsArray.push({'req6':{'value':JSON.parse(results[re])}})
break;
case '6':
requestsArray.push({'req7':{'value':JSON.parse(results[re])}})
break;
}
}
return requestsArray;
})
.catch(function (err) {
console.log('Error: ', err);
})
}
module.exports = {getExampleFile};
return requests Array
返回空(或未定义),因为 if 运行时没有等待 for 循环完成。
我怎样才能让它等待 for 循环完成,因为在这种情况下它已经嵌套在 .then() 中?
我经历了很多选择,从 Promises 开始,使用另一个将在第 6 次迭代时调用的函数,然后遍历 async await。
一直在玩弄它,但仍然不完全确定如何在这种情况下实施每一个建议的解决方案。
谢谢。
我上面的评论是:return Promise.all(....
.
生成您想要的结构的更漂亮的方法是为每个异步调用创建一个承诺,该调用将请求参数作为输入并将请求的结果写回到同一个对象(将其视为待办事项列表),像这样:
function getRequests(){
const req1 = {
method: 'GET',
uri: 'url'
}
const req2 = {
method: 'GET',
uri: 'url'
}
// etc.
let todoList = [{ request:req1 }, { request:req2 }, ...];
let promises = todoList.map(item => {
return reqP(item.request).then(result => {
item.value = JSON.parse(result);
return item;
});
});
return Promise.all(promises);
}
这个想法是 return 承诺在履行时将请求结果与请求相关联。 getRequests()
将 return 承诺解析为:
[{ request:req1, value:/* json parsed result */}, {...}, ...},