NodeJS - Получение 'undefined' при возврате значений из функции Promise.all - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть следующий код:

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 возвращается пустым (или неопределенным), потому что если он запускается без ожидания завершения цикла.
Как я могу это сделатьждать завершения цикла for, так как в этом случае он уже вложен в .then ()?

Я прошел через множество опций, начиная с Promises, используя другую функцию, которая будет вызываться на 6-й итерации, и переходя к асинхронному ожиданию.
Работал с этим, но все еще не совсемхотя, конечно, убедитесь, как реализовать каждое из предложенных решений.

Спасибо.

1 Ответ

0 голосов
/ 20 сентября 2018

Мой комментарий выше: 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 */}, {...}, ...},
...