gpt4 book ai didi

typescript - 如何启用 async.mapLimit 与 TypeScript async/await 配合使用

转载 作者:行者123 更新时间:2023-12-02 20:42:44 24 4
gpt4 key购买 nike

是否可以使用 Async NPM module在 TypeScript 2.2x 中使用 async/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 来处理多个调用?

最佳答案

Is it possible to use the 'async' npm module to work with async / await in Typescript

是的。

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

due to JavaScript limitations, we can only detect native async functions and not transpilied implementations.

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

If you are using async functions through a transpiler (e.g. Babel), you must still wrap the function with asyncify, because the async function will be compiled to an ordinary function that returns a 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();

关于typescript - 如何启用 async.mapLimit 与 TypeScript async/await 配合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45572743/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com