【问题标题】:"Inject" callback with async/await带有异步/等待的“注入”回调
【发布时间】:2017-03-31 09:17:43
【问题描述】:

我正在重构一些承诺代码以使用async/await,除了一件事之外它工作得很好。

Promise 让您做的事情是在您想要的任何地方“注入”回调。例如:

public DoSomethingAsync() {
   return new Promise<void>(done => {
      // do some stuff
      done();
   });
}

甚至可能回调被另一个回调包裹:

public DoSomethingAsync() {
   return new Promise<void>(done => {
      const somethingDeferred = GetSomethingDeferred();
      somethingDeferred.onsuccess = () => {
         // some success code
         done();
      };
   });
}

“拒绝”处理程序也存在类似问题。

有没有办法将这些重构为async/await?还是他们被困在new Promise... 块中?

我认为第一个示例可以一直简化为:

public async DoSomethingAsync() {
   // do some stuff
}

因为无论如何都会自动调用回调。但第二个例子似乎问题更大。

【问题讨论】:

    标签: typescript callback promise async-await


    【解决方案1】:

    有没有办法将这些重构为async/await?

    没有。

    或者他们被困在new Promise... 块中?

    是的。您需要 promisify 这些异步函数,但不返回已经使用 new Promise 构造函数(或可以缩短重复代码的辅助函数)的承诺,没有办法解决这个问题。您将第二个示例重写为

    public async DoSomethingAsync() {
        await new Promise<void>((resolve, reject) => {
            const somethingDeferred = GetSomethingDeferred();
            somethingDeferred.onsuccess = resolve;
            somethingDeferred.onerror = reject;
        });
        // some success code
        return …;
    }
    

    或者,使用辅助函数:

    function toPromise(somethingDeferred) {
        return new Promise<void>((resolve, reject) => {
            somethingDeferred.onsuccess = resolve;
            somethingDeferred.onerror = reject;
        });
    }
    
    public async DoSomethingAsync() {
        await toPromise(GetSomethingDeferred());
        // some success code
        return …;
    }
    

    【讨论】:

      猜你喜欢
      • 2021-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-10
      • 2018-09-22
      • 2017-06-29
      • 2019-11-15
      • 1970-01-01
      相关资源
      最近更新 更多