2016-11-17 131 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 …; 
}