node.js - NodeJS - 从 Promise.all 函数返回值时获取“未定义”
问题描述
我有以下代码:
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);
}
这个想法是返回承诺,当履行时会将请求结果与请求相关联。 getRequests()
将返回解析为:
[{ request:req1, value:/* json parsed result */}, {...}, ...},
推荐阅读
- python - 如何在列之间进行求和和除以更改数据框中现有列的值?
- html - 无法使用 xpath 查询提取值
- makefile - 将 Fortran 模块链接在一起
- javascript - Tempus Dominus 使用 datetimepicker 防止输入字段上的移动键盘
- javascript - 如何在按下热键时修复动态输入创建的重复
- r - 如果该对象尚不存在,我可以告诉 R 创建一个对象吗?
- regex - 如何在Oracle中找到字符串的完全匹配并替换?
- javascript - ckeditor 将 html 实体显示为纯文本
- python - “TypeError:'<'不支持”的问题
- asp.net-core - WebAPI 的生产 WebServer 不允许 HTTPPost (aspnetcore 2.2)