Async: Janji Kembali jika panggilan balik tidak diberikan?

Dibuat pada 27 Feb 2018  ·  8Komentar  ·  Sumber: caolan/async

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

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 .

Semua 8 komentar

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

  • Konversikan ke metode asinkron
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);
};
Apakah halaman ini membantu?
0 / 5 - 0 peringkat