Приятно иметь в ES2017 асинхронную/ожидающую разработку
const asyncjs = require('async');
const foo = async () => {
const arr = Array.from({ length: 1000 }, (v, i) => i);
const transformedArr = await asyncjs.mapLimit(arr, 100, async (v) => {
return await Promise.resolve(v * 2);
});
console.log(transformedArr);
}
Исторически так сложилось, что async
были против этого (см. #1086).
Тем не менее, с новым синтаксисом async/await
, узлом, добавляющим API промисов в будущем , и увеличением поддержки промисов, я был бы готов вернуться к этому. Мысли @aearly @megawac?
Я подумал об этом и немного поэкспериментировал. Люди захотят await Async.mapLimit(arr, 10, async foo => {...})
. Это вполне может быть что-то, что мы включим в 3.0.
Кроме того, некоторые асинхронные методы были бы довольно глупыми с async/await, например, series
, waterfall
.
При использовании Async я естественным образом предполагал возврат обещания. Только в момент сбоя в работе моего кода и моего рутинного rtfm я заметил структуру обратного вызова. Вышеизложенное было бы очень кстати, так как это позволило бы сохранить код как можно более однородным для ES7.
Я согласен, что это было бы полезно.
Тем временем, если кто-то застрял прямо сейчас, я нашел эту статью полезной для объяснения того, как написать цикл forEach с ожиданием.
https://codeburst.io/javascript-async-await-with-foreach-b6ba62bbf404
Наконец-то откопал свой старый эксперимент: #1526
+1
function makeAsync() {
if (arguments.length < 3) return; // wrong params, not run or throw exception here!
let fixParams = {};
let paramLength = arguments.length;
let method = arguments[0];
for (let i = 1; i < arguments.length; i++) {
fixParams[(i - 1)] = arguments[i];
}
return new Promise((resolve, reject) => {
const callback = (err, result) => {
if (err) return reject(err);
return resolve(result);
};
fixParams[paramLength - 1] = callback;
fixParams.length = paramLength;
method.apply(null, fixParams);
});
}
пример1:
await makeAsync(async.each, openFiles, async (file) => {
await asyncOperation(file);
});
пример2:
const foo = async () => {
const arr = Array.from({ length: 1000 }, (v, i) => i);
const transformedArr = await makeAsync(async.mapLimit, arr, 100, async (v) => {
return await Promise.resolve(v * 2);
});
console.log(transformedArr);
}
@tritoanst , ваша функция обещания накладная. Может быть проще:
function promisify(original) {
return function (...args) {
return new Promise((resolve, reject) => {
args.push((err, result) => {
if (err) {
reject(err);
} else {
resolve(result);
}
});
original.apply(this, args);
});
};
}
const foo = async () => {
const arr = Array.from({ length: 1000 }, (v, i) => i);
const transformedArr = await promisify(async.mapLimit)(arr, 100, async (v) => {
return v * 2; // `return await` is redundant
});
console.log(transformedArr);
};
Самый полезный комментарий
Я подумал об этом и немного поэкспериментировал. Люди захотят
await Async.mapLimit(arr, 10, async foo => {...})
. Это вполне может быть что-то, что мы включим в 3.0.Кроме того, некоторые асинхронные методы были бы довольно глупыми с async/await, например,
series
,waterfall
.