使用async / await“注入”回调

时间:2016-11-17 00:07:59

标签: typescript callback promise async-await

我正在重构一些使用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
}

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

1 个答案:

答案 0 :(得分:3)

  

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

没有

  

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

是。你需要promisify这些异步的函数,但是不使用new Promise构造函数(或者可以缩短重复代码的辅助函数)返回一个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 …;
}