WinJS で、チェーンを「ブレイクアウト」する必要がある場合、promise をチェーンする正しい方法は何ですか? たとえば、.then() 関数と final .done() があるとします。その後に他のエラーがある then からエラーを返す正しい方法は何ですか?
次の疑似コードの例を考えてみましょう
function doSomething(){
return new WinJS.Promise(function(comp,err,prog){
filePicker.pickSingleFileAsync().then(function(file){
if(file){ // have a valid file
return readTextAsync(File);
}else{ //else user clicked cancel
return err('No file');
}
}).then(function(text){
if(text){
return comp(text);
}else{
return err('No text');
}
}).done(null, function(error){ //final done to catch errors
return err(error);
});
});// end return promise
} //end doSomething();
doSomething().done(function(text){
console.log(text);
}, function(err){
console.log(err);
});
この単純化された例では、ユーザーが filePicker をキャンセルすると、最初の err("No File"); にヒットするはずです。ただし、これは引き続き次の .then(text) の呼び出しに進み、テキストが定義されていないため、エラー (「テキストなし」) も返されます。全体的な doSomething().done() エラー ハンドラーは、ここで "No File" を返します。この時点でプロミスチェーンを実際に終了することは可能ですか? ここでanyメソッドを使用する方法を検討する必要がありますか?
ありがとう
* * *編集。以下の受け入れられた回答に基づいて、他の人が私のソリューションがどのように見えるかを知りたい場合は、次のとおりです。
filePicker.pickSingleFileAsync().then(function (file) {
if (file) {
return Windows.Storage.FileIO.readTextAsync(file);
}
return WinJS.Promise.wrapError("No File");
}).then(function (text) {
if (text) {
return complete(text);
}
return error("no text");
}).done(null, function (err) {
return error(err);
});