如何使async.mapLimit与TypeScript异步/等待一起使用

问题描述 投票:1回答:2

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

目标:创建一个Web抓取工具,使用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
2个回答
2
投票

是否可以使用'async'npm模块与Typescript中的async / await一起使用?>

我发现mapLimit只是为第一组调用了迭代器。这是因为我正在从TypeScript进行编译。如果我对JS使用本机异步/等待,那么它就可以工作。这是因为,引用自async docs for AsyncFunction

由于JavaScript的限制,我们只能检测本机异步函数,而不能执行跨语言的实现。

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

[如果您通过转译器(例如Babel)使用异步函数,则仍必须使用asyncify封装该函数,因为异步函数将被编译为返回promise的普通函数。

这是一个有些人为设计的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();

0
投票

没有async模块为无法或不会使用Promises的人们提供实用程序和抽象。他们不混在一起。

© www.soinside.com 2019 - 2024. All rights reserved.