2017-08-21 9 views
0

私は一連の約束を持っており、完了するのに十分な時間がかかりました。サンプル・チェーンの設定です下:このジョブが実行されている平均時間でNodeJS - イベントが受信された場合、約束を破棄します

myJob1() 
.then(myJob2) 
.then(myJob3) 
.then(myJob4) 
.then(myJob5) 
.then(myJob6) 
.catch(myJobError); 

UI上の人はそれをキャンセルすると思えば、どのようにそれが何であれ、ステージ/関数実行中にキャンセルすることができますか?

可能な解決策は何ですか?

+0

本当に多くの情報が必要です。特にあなたがクライアントと言うとき。あなたのクライアントには、何らかの形のRPCが用意されていますか?約束を取り消すことは簡単ですが、バックエンドには難しい部分があります。 – Keith

+1

[EMCAScript6(バニラJavaScript)の約定をキャンセルする方法](https://stackoverflow.com/questions/29478751/how-to-cancel-an-emcascript6-vanilla-javascript-promise-chain) – TheCog

+0

の可能な複製キャンセルすることはできませんが、却下することはできます。その後、その時の残りの部分は呼び出されなくなります。あなたはそれぞれの仕事の中で何かをテストしなければならないでしょう。そして、そのテストが合格すれば、新たに拒否された約束を返します。すなわち 'return Promise.reject( 'reason')' –

答えて

0

約束を取り消す方法はありません(それぞれの約束が新しい約束を返すことを忘れないでください)。thenコールバックをクリアしてください。

redux-observableのようなものを探している可能性があります。約束の実行が実際になるまで、節を指定できます。

は詳細に詳細を参照してください。別の方法としてhttps://github.com/redux-observable/redux-observable/blob/master/docs/recipes/Cancellation.md

を、私はあなたがさらにプロセスが必要とされているか否かを判断し、いくつかのフラグを作成および管理するためだけに提案することがあります。

// Inside each of promises in chain 
if (notCancelled) { 
    callAjax(params).then(resolve); 
} 

か拒否:

// Inside each of promises in chain 
if (cancelled) { 
    // Will stop execution of promise chain 
    return reject(new Error('Cancelled by user')); 
} 
1

複数のジョブ機能のコードを変更する方法の1つは、ジョブ間のユーザーキャンセルフラグをチェックすることです。あなたが行う場合はキャンセルを確認することを忘れてはいけない

let userCancelled = false; 
let checkCancel = function(data) { 
    if(userCancelled) 
     throw new Error("cancelled by user"); // invoke catch handling 
    return data; // pass through the data 
} 

myJob1() 
.then(myJob2).then(checkCancel) 
.then(myJob3).then(checkCancel) 
.then(myJob4).then(checkCancel) 
.then(myJob5).then(checkCancel) 
.then(myJob6).then(checkCancel) 
.catch(myJobError); 

:チェックのこの種の粒度があまりにも当然ではない場合は、非同期的に(やや)グローバルキャンセルフラグを設定しての線に沿って進めることができあなたがしなければならないことは、それが約束を破棄するためのエラーを投げることだけです。

関連する問題