2016-11-17 135 views
1

我重构一些承诺代码使用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 
} 

因为回调将自动反正以后叫。但第二个例子似乎更成问题。

回答

3

有没有办法将这些重构为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 …; 
}