在异步/等待中使用Promise

时间:2017-08-06 21:22:09

标签: typescript async-await es6-promise

我从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);
    });
}

因此...

  1. 在此功能之前,我真的需要async个关键字吗?我想,它什么都没做......
  2. 我应该在Promise执行程序函数作用域中还是在readAsArrayBuffer作用域级别创建新的FileReader? (......或者它没关系?)
  3. 我写的是嵌套在函数中的函数嵌套的两个函数。难道我做错了什么? : - )

2 个答案:

答案 0 :(得分:3)

  
      
  1. 在此功能之前我真的需要async关键字吗?我想,它什么都没做......
  2.   

不,当函数使用async关键字时,只需要await,这会使函数异步执行,而函数则不是这样:它同步执行完成。异步部分仅在触发回调时,而不是async关键字的内容。

  
      
  1. 我应该在Promise执行程序函数作用域中还是在readAsArrayBuffer作用域级别创建新的FileReader? (......或者没关系?)
  2.   

最佳做法是在作业所需的最小范围内定义变量。虽然它可以以任何一种方式工作,但现在你可以更好。

  
      
  1. 我写的是嵌套在函数中的函数嵌套的两个函数。难道我做错了什么? : - )
  2.   

没有错。

答案 1 :(得分:3)

  

在此功能之前我真的需要async关键字吗?我想,它什么都没做......

不。如果您在函数体内使用async,则只需要await关键字。

  

我应该在Promise执行程序函数作用域中还是在readAsArrayBuffer作用域级别创建新的FileReader? (......或者它并不重要?)

我建议将大部分实际代码保留在执行程序函数中。优点是,如果您有同步异常(例如,如果new FileReader()在构造时为throw,则执行程序将捕获该异常并将其转换为异步承诺拒绝。如果将它放在执行程序函数之外,那么您的函数将抛出同步异常。这将使用起来很混乱,因为您必须单独处理同步和异步异常。

  

我写的是嵌套在函数中的函数嵌套的两个函数。难道我做错了什么? : - )

没关系。当您围绕非承诺API编写承诺包装器时,这是一种非常常见的模式。优点是您现在可以将此包装器与await一起使用,并避免在代码的其他部分中嵌套函数。 : - )