Async: コールバックが提供されていない場合はPromiseを返しますか?

作成日 2018年02月27日  ·  8コメント  ·  ソース: caolan/async

ES2017 async/await開発に参加できてうれしいです

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に含まれているものである可能性があります。

また、 serieswaterfallなど、一部のAsyncメソッドはasync/awaitではかなりばかげています。

全てのコメント8件

歴史的に、 asyncはこれに反対してきました(#1086を参照)。

ただし、新しいasync/await構文、将来的にノードがpromise APIを追加し、promiseのサポートが増えたことで、これを再検討することができます。 @aearly @megawacと思いますか?

私はこれについて考え、少し実験しました。 人々はawait Async.mapLimit(arr, 10, async foo => {...})を望んでいます。 これは、3.0に含まれているものである可能性があります。

また、 serieswaterfallなど、一部のAsyncメソッドはasync/awaitではかなりばかげています。

Asyncを使用するとき、私は当然、Promiseのリターンを想定していました。 コールバック構造に気付いたのは、コードが機能しなくなったときと、ルーチンのrtfmの瞬間だけでした。 上記は、コードを可能な限り均一なES7に保つため、非常に歓迎されます。

これが役立つことに同意します。

暫定的に、誰かが今立ち往生しているなら、私はこの記事がawaitでforEachループを書く方法を説明するのに良いと思いました。
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 、promisify関数はオーバーヘッドです。 それは簡単かもしれません:

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 評価