É bom ter no desenvolvimento assíncrono/aguardado do 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);
}
Historicamente, async
tem sido contra isso (veja #1086).
No entanto, com a nova sintaxe async/await
, nó adicionando APIs de promessa no futuro e o suporte para promessas aumentando, eu estaria aberto a revisitar isso. Pensamentos @aearly @megawac?
Eu pensei sobre isso e experimentei um pouco. As pessoas vão querer await Async.mapLimit(arr, 10, async foo => {...})
. Poderia muito bem ser algo que incluímos no 3.0.
Além disso, alguns métodos Async seriam bem bobos com async/await, por exemplo series
, waterfall
.
Ao usar o Async, naturalmente assumi o retorno de uma promessa. Foi apenas no dis-funcionamento do meu código e meu momento rtfm de rotina que notei a estrutura de retorno de chamada. O acima seria muito bem-vindo, pois manteria o código ES7 o mais uniforme possível.
Concordo que isso seria útil.
Nesse ínterim, se alguém estiver preso agora, achei este artigo bom para explicar como escrever um loop forEach com await.
https://codeburst.io/javascript-async-await-with-foreach-b6ba62bbf404
Finalmente desenterrei meu antigo experimento: #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);
});
}
Exemplo 1:
await makeAsync(async.each, openFiles, async (file) => {
await asyncOperation(file);
});
exemplo2:
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 , sua função promisify está sobrecarregada. Pode ser mais fácil:
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);
};
Comentários muito úteis
Eu pensei sobre isso e experimentei um pouco. As pessoas vão querer
await Async.mapLimit(arr, 10, async foo => {...})
. Poderia muito bem ser algo que incluímos no 3.0.Além disso, alguns métodos Async seriam bem bobos com async/await, por exemplo
series
,waterfall
.