2016-11-17 49 views
1

私は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 
} 

コールバックが自動的にとにかく後で呼び出されますので。しかし、2番目の例ははるかに問題が多いようです。

答えて

3

これらをリファクタリングする方法はありますか?async/awaitnew Promise...ブロックに包ま

それとも、立ち往生していますか?

はい。 promisifyこれらの関数は非同期ですが、既にnew Promiseコンストラクタ(または反復コードを短縮できるヘルパ関数)を使用して約束を返していないため、その回避策はありません。

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 …; 
} 
:あなたはヘルパー関数で、

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

にあなたの第二の例を書き換えるかと思います

関連する問題