Async: рдпрджрд┐ рдХреЙрд▓рдмреИрдХ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рд╡рд╛рдкрд╕реА рдХрд╛ рд╡рд╛рджрд╛?

рдХреЛ рдирд┐рд░реНрдорд┐рдд 27 рдлрд╝рд░ре░ 2018  ┬╖  8рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: caolan/async

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);
}
feature feedback-wanted

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рдереЛрдбрд╝рд╛ рдкреНрд░рдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИред рд▓реЛрдЧ await Async.mapLimit(arr, 10, async foo => {...}) рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдпрд╣ рдХреБрдЫ рдРрд╕рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо 3.0 рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рддреЗ рд╣реИрдВред

рд╕рд╛рде рд╣реА, рдХреБрдЫ рдПрд╕рд┐рдВрдХ рд╡рд┐рдзрд┐рдпрд╛рдВ рдПрд╕рд┐рдВрдХ/рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рдореВрд░реНрдЦрддрд╛рдкреВрд░реНрдг рд╣реЛрдВрдЧреА, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП series , waterfall ред

рд╕рднреА 8 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдРрддрд┐рд╣рд╛рд╕рд┐рдХ рд░реВрдк рд╕реЗ, 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

  • async рд╡рд┐рдзрд┐ рдореЗрдВ рдХрдирд╡рд░реНрдЯ рдХрд░реЗрдВ
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);
};
рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

trvra picture trvra  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

brainthinks picture brainthinks  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

AaronAcerboni picture AaronAcerboni  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

mjafarpour picture mjafarpour  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

avieru picture avieru  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ