【问题标题】:How to enable async.mapLimit to work with TypeScript async / await如何启用 async.mapLimit 以使用 TypeScript async / await
【发布时间】:2018-01-16 06:49:57
【问题描述】:

是否可以在 TypeScript 2.2x 中使用 Async NPM moduleasync/await 一起使用?

目标: 创建一个使用 Async 的 mapLimit function 启动 10 个并行 HTTP 请求的网络爬虫。

包装的 HTTP 函数的示例如下:

async callUniRest(url: string): Promise<number> {
  return new Promise<number>(resolve => {
    unirest.get(url)
      .end((response: any) => {
          resolve(cheerio.load(response.body);
      });
    });
}

问题:

当我跑步时:

const myList: string[] = ['http...', 'http...', 'http...', 'http...']
async.mapLimit(myList, 10, callUniRest, function(err: any, results: any {
  console.log(results);
})

只有在第一个元素完成后才会调用回调。

问题: 如何启用async.mapLimit 处理多个呼叫?

【问题讨论】:

    标签: typescript async-await async.js


    【解决方案1】:

    是否可以在 Typescript 中使用 'async' npm 模块来处理 async / await

    是的。

    我发现mapLimit 只是为第一组调用迭代器。这是因为我是从 TypeScript 转译的。如果我将本机 async/await 与 JS 一起使用,那么它可以工作。这是因为,引用自async docs for AsyncFunction

    由于 JavaScript 的限制,我们只能检测本机异步函数,而不能检测转译实现。

    因此,如果您使用异步库中的 asyncify 包装您的迭代器,那么您可以从迭代器内部返回而不使用回调:

    如果您通过转译器(例如 Babel)使用异步函数,您仍然必须使用 asyncify 包装函数,因为异步函数将被编译为返回承诺的普通函数。

    这是一个有点做作的 TypeScript 示例,它演示了如何执行此操作。注意:如果您删除 asyncify 调用,它将不起作用:

    import { asyncify, mapLimit } from "async";
    
    const listOfThings = "abcdefghijklmnopqrstuvwxyz".split("");
    
    const convertToUppercase = async () =>
      await mapLimit<string, string[]>(
        listOfThings,
        5,
        asyncify(async letter => letter.toUpperCase())
      );
    
    const init = async () => {
      const uppered = await convertToUppercase();
    
      console.log("done", uppered);
    };
    
    init();
    

    【讨论】:

      【解决方案2】:

      没有。 async 模块为不能或不会使用 Promises 的人提供实用程序和抽象。它们不会混合。

      更不用说,当你有myList时,所有的请求都已经发送了。

      async.mapLimit 仅适用于接受回调的函数,不适用于返回 Promise 的函数。

      您可能想要的是使用 Bluebird 的 Promise.map() with the concurrency operator

      【讨论】:

      • 我想一个更好的问题是如何使用异步等待启用并发
      • @JackMurphy 有一个计数器/堆栈。没有内置的方法。因此我建议使用 Bluebird。
      猜你喜欢
      • 2017-05-29
      • 1970-01-01
      • 1970-01-01
      • 2017-10-03
      • 2016-02-26
      • 2016-08-22
      • 1970-01-01
      • 2021-01-14
      • 1970-01-01
      相关资源
      最近更新 更多