我从TypeScript中的async / await开始,我对此几乎没有任何疑问。我写了这个函数来从Blob获取ArrayBuffer。
async function readAsArrayBuffer(blob: Blob): Promise<ArrayBuffer> {
return new Promise<ArrayBuffer>((resolve, reject) => {
let reader = new FileReader();
reader.addEventListener('load', e => resolve((<FileReader>e.target).result));
reader.addEventListener('error', e => reject((<FileReader>e.target).error));
reader.readAsArrayBuffer(blob);
});
}
因此...
async
个关键字吗?我想,它什么都没做...... 答案 0 :(得分:3)
- 在此功能之前我真的需要async关键字吗?我想,它什么都没做......
醇>
不,当函数使用async
关键字时,只需要await
,这会使函数异步执行,而函数则不是这样:它同步执行完成。异步部分仅在触发回调时,而不是async
关键字的内容。
- 我应该在Promise执行程序函数作用域中还是在readAsArrayBuffer作用域级别创建新的FileReader? (......或者没关系?)
醇>
最佳做法是在作业所需的最小范围内定义变量。虽然它可以以任何一种方式工作,但现在你可以更好。
- 我写的是嵌套在函数中的函数嵌套的两个函数。难道我做错了什么? : - )
醇>
没有错。
答案 1 :(得分:3)
在此功能之前我真的需要async关键字吗?我想,它什么都没做......
不。如果您在函数体内使用async
,则只需要await
关键字。
我应该在Promise执行程序函数作用域中还是在readAsArrayBuffer作用域级别创建新的FileReader? (......或者它并不重要?)
我建议将大部分实际代码保留在执行程序函数中。优点是,如果您有同步异常(例如,如果new FileReader()
在构造时为throw
,则执行程序将捕获该异常并将其转换为异步承诺拒绝。如果将它放在执行程序函数之外,那么您的函数将抛出同步异常。这将使用起来很混乱,因为您必须单独处理同步和异步异常。
我写的是嵌套在函数中的函数嵌套的两个函数。难道我做错了什么? : - )
没关系。当您围绕非承诺API编写承诺包装器时,这是一种非常常见的模式。优点是您现在可以将此包装器与await
一起使用,并避免在代码的其他部分中嵌套函数。 : - )