【问题标题】:NodeJS - Getting 'undefined' while returning values from Promise.all functionNodeJS - 从 Promise.all 函数返回值时获取“未定义”
【发布时间】:2019-02-25 00:54:01
【问题描述】:

我有以下代码:

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 次迭代时调用的函数并完成异步等待。
一直在玩它,但仍然不完全确定在这种情况下如何实施每一个建议的解决方案。

谢谢。

【问题讨论】:

  • getRequests() 不返回任何内容。它应该返回由 Promise.all() 创建的承诺,换句话说:return Promise.all([reqP(req1), ...
  • 删除Promise.promisifyAllreqeust-promise 包已经返回了承诺!

标签: node.js promise return undefined es6-promise


【解决方案1】:

我上面的评论是:return Promise.all(....

生成您要使用的结构的一种更漂亮的方法是为每个异步调用创建一个承诺,该调用将请求参数作为输入并将请求的结果写回同一个对象(将其视为-do list),像这样:

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 */}, {...}, ...},

【讨论】:

  • 谢谢 danh,我设法使用您的回答和以下线程完全解决了问题:[stackoverflow.com/questions/45930001/… 以及用于“解析”返回请求的以下代码:requestList.getRequest().then(reqs => { console.log(reqs); }).catch(err => { console.log(err); });
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-17
  • 1970-01-01
  • 1970-01-01
  • 2016-05-20
相关资源
最近更新 更多