Я пытаюсь использовать обещание для ожидания 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