Подождите asyn c .maplimit, используя обещание - PullRequest
0 голосов
/ 27 февраля 2020

Я пытаюсь использовать обещание для ожидания asyn c .mapLimit. Я использую его для одновременного запуска нескольких сценариев оболочки, и Я хочу дождаться, пока все они завершат выполнение sh, прежде чем продолжить после окончания журнала 'the end'. Но я всегда получаю неопределенное при использовании возвращаемого значения для обещания.

var myArray = [5,1,2,3,4];

const async = require('async');
const exec = require('child_process').exec;

function understandPromise() {

    const _waitForMe = async.mapLimit(myArray, 16, doSomeThing, function(err, results){
        console.log(results.length, 'should equal (doSomeThing)', myArray.length);
        console.log('err',err);

    });

    // This also gives undefined
    //const _waitForMe = async.mapLimit(myArray, 16, doSomeThing).then(a,b);
    _waitForMe.then(a,b);

    console.log('the end');

}

function doSomeThing(item, callback){

    let runCmd = './test.sh ' + item;
    console.log('before', runCmd);
    exec(runCmd, function (error, stdout, stderr) {
        console.log('error', error);
        console.log('stderr', stderr);
        console.log('stdout', stdout);
        console.log('after', runCmd);
        callback(null, item); // or actually do something to item
    });

}

understandPromise();

TypeError: Невозможно прочитать свойство 'then' из неопределенного , относящегося к _waitForMe

Почему mapLimit не возвращает обещание ? Я понимаю, что я делаю что-то в корне неправильно, но я не могу понять, что. Я мог бы рассмотреть и другие решения, не связанные с обещанием.

Пропуск обратного вызова приводит к той же проблеме 'then' из неопределенного

const _waitForMe = async.mapLimit(myArray, 16, doSomeThing);

Подобные вопросы SO, подобные этому, дают только ошибки asyn c .mapLimit с Promise

Обновление 1 после комментариев Комментаторы предложили следующее:

async function understandPromise() {
        let results = await async.mapLimit(myArray, 8, doSomeThing);
        console.log('results', results.length);
        console.log('the end');
}

Но это приводит к (узел : 567) UnhandledPromiseRejectionWarning: TypeError: Невозможно прочитать свойство 'length' с неопределенным значением.

Я до сих пор не могу понять, почему возврат asyn c .mapLimit не определен, если не используется обратный вызов.

Обновление 2

Я получил это, чтобы работать из комментариев, но в итоге это было, что модуль asyn c был на старой версии 1.5 .2 а не на более новую 3.2.0

1 Ответ

0 голосов
/ 27 февраля 2020

Проблема в том, что вы передаете обратный вызов в конце функции. В документации четко написано it returns a promise, if no callback is passed. Удалите function(err, results), и он должен начать возвращать обещание.

const results = await async.mapLimit(myArray, 16, doSomeThing);
console.log(results.length, 'should equal (doSomeThing)', myArray.length);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...