Senang memiliki di ES2017 async/menunggu pengembangan
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);
}
Secara historis, async
telah menentang ini (lihat #1086).
Namun, dengan sintaks async/await
baru, node menambahkan API janji di masa mendatang , dan dukungan untuk janji meningkat, saya akan terbuka untuk meninjau kembali ini. Pikiran @aearly @megavac?
Saya sudah memikirkan ini, dan bereksperimen dengannya sedikit. Orang akan ingin await Async.mapLimit(arr, 10, async foo => {...})
. Itu bisa menjadi sesuatu yang kami sertakan dalam 3.0.
Juga, beberapa metode Async akan sangat konyol dengan async/await, misalnya series
, waterfall
.
Saat menggunakan Async, saya secara alami mengasumsikan kembalinya Janji. Hanya pada saat kode saya tidak berfungsi dan momen rtfm rutin saya, saya melihat struktur panggilan balik. Di atas akan sangat disambut karena akan menjaga kode ES7 seseragam mungkin.
Saya setuju bahwa ini akan berguna.
Untuk sementara, jika ada yang terjebak sekarang, saya menemukan artikel ini bagus untuk menjelaskan cara menulis perulangan forEach dengan menunggu.
https://codeburst.io/javascript-async-await-with-foreach-b6ba62bbf404
Akhirnya menggali eksperimen lama saya: #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);
});
}
Contoh 1:
await makeAsync(async.each, openFiles, async (file) => {
await asyncOperation(file);
});
contoh2:
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 , fungsi janji Anda ada di atas kepala. Mungkin lebih mudah:
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);
};
Komentar yang paling membantu
Saya sudah memikirkan ini, dan bereksperimen dengannya sedikit. Orang akan ingin
await Async.mapLimit(arr, 10, async foo => {...})
. Itu bisa menjadi sesuatu yang kami sertakan dalam 3.0.Juga, beberapa metode Async akan sangat konyol dengan async/await, misalnya
series
,waterfall
.