是否可以在TypeScript 2.2x中使用Async NPM module与async
/ 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
处理多个呼叫?
是否可以使用'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();
没有async
模块为无法或不会使用Promises的人们提供实用程序和抽象。他们不混在一起。