Async: 如果未提供回调,则返回 Promise?

创建于 2018-02-27  ·  8评论  ·  资料来源: caolan/async

很高兴在 ES2017 异步/等待开发中拥有

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 中包含的内容。

此外,一些 Async 方法对于 async/await 会非常愚蠢,例如serieswaterfall

所有8条评论

从历史上看, async一直反对这一点(参见 #1086)。

然而,随着新的async/await语法、未来节点添加承诺 API以及对承诺的支持增加,我愿意重新审视这一点。 想法@aearly @megawac?

我已经考虑过这个问题,并进行了一些实验。 人们会想要await Async.mapLimit(arr, 10, async foo => {...}) 。 这很可能是我们在 3.0 中包含的内容。

此外,一些 Async 方法对于 async/await 会非常愚蠢,例如serieswaterfall

当使用 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 等级