ES2017 async/рд╡рд┐рдХрд╛рд╕ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдореЗрдВ рд╣реЛрдирд╛ рдЕрдЪреНрдЫрд╛ рд▓рдЧрд╛
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
рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд╕рд╛рде, рдиреЛрдб рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╡рд╛рджрд╛ рдПрдкреАрдЖрдИ рдЬреЛрдбрд╝ рд░рд╣рд╛ рд╣реИ , рдФрд░ рд╡рд╛рджреЛрдВ рдХреЗ рд╕рдорд░реНрдерди рдореЗрдВ рд╡реГрджреНрдзрд┐ рд╣реБрдИ рд╣реИ, рдореИрдВ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реВрдВред рд╡рд┐рдЪрд╛рд░ @aearly @megawac?
рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рдереЛрдбрд╝рд╛ рдкреНрд░рдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИред рд▓реЛрдЧ await Async.mapLimit(arr, 10, async foo => {...})
рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдпрд╣ рдХреБрдЫ рдРрд╕рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо 3.0 рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рддреЗ рд╣реИрдВред
рд╕рд╛рде рд╣реА, рдХреБрдЫ рдПрд╕рд┐рдВрдХ рд╡рд┐рдзрд┐рдпрд╛рдВ рдПрд╕рд┐рдВрдХ/рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рдореВрд░реНрдЦрддрд╛рдкреВрд░реНрдг рд╣реЛрдВрдЧреА, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП series
, waterfall
ред
Async рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп I рдиреЗ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рдПрдХ рд╡рд╛рджреЗ рдХреА рд╡рд╛рдкрд╕реА рдорд╛рди рд▓реАред рдпрд╣ рдХреЗрд╡рд▓ рдореЗрд░реЗ рдХреЛрдб рдХреЗ рдЦрд░рд╛рдм рд╣реЛрдиреЗ рдФрд░ рдореЗрд░реЗ рдирд┐рдпрдорд┐рдд рдЖрд░рдЯреАрдПрдлрдПрдо рдкрд▓ рдореЗрдВ рдерд╛ рдХрд┐ рдореИрдВрдиреЗ рдХреЙрд▓рдмреИрдХ рд╕рдВрд░рдЪрдирд╛ рдкрд░ рдзреНрдпрд╛рди рджрд┐рдпрд╛ред рдЙрдкрд░реЛрдХреНрдд рдХрд╛ рдмрд╣реБрдд рд╕реНрд╡рд╛рдЧрдд рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХреЛрдб рдХреЛ рдпрдерд╛рд╕рдВрднрд╡ рд╕рдорд╛рди ES7 рдХреЗ рд░реВрдк рдореЗрдВ рд░рдЦреЗрдЧрд╛ред
рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рдпрд╣ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред
рдЕрдВрддрд░рд┐рдо рдореЗрдВ, рдЕрдЧрд░ рдХреЛрдИ рдЕрднреА рдлрдВрд╕ рдЧрдпрд╛ рд╣реИ, рддреЛ рдореБрдЭреЗ рдпрд╣ рдЖрд▓реЗрдЦ рдпрд╣ рд╕рдордЭрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рд▓рдЧрд╛ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд▓реВрдк рдХреЛ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рд▓рд┐рдЦрдирд╛ рд╣реИред
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 рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рддреЗ рд╣реИрдВредрд╕рд╛рде рд╣реА, рдХреБрдЫ рдПрд╕рд┐рдВрдХ рд╡рд┐рдзрд┐рдпрд╛рдВ рдПрд╕рд┐рдВрдХ/рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рдореВрд░реНрдЦрддрд╛рдкреВрд░реНрдг рд╣реЛрдВрдЧреА, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП
series
,waterfall
ред