1

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);
        });
4

3 に答える 3

4

WinJS.Promise.wrapErrorpromise チェーンにエラーを返すために使用します。

あなたの例では、実際の「エラー」が途中で表面化した場合、最後にエラーを処理することを選択できます。

これにより、エラーを「修正」し、「成功ケース」を続行できるようになります。チェーンの途中でエラー ハンドラから値を返すと、その値が成功チェーンに沿って伝播されます。

于 2012-12-04T22:31:09.937 に答える
0

完全にはわかりませんが、「return err('...')」の代わりに err('No text') を呼び出してみてください。

于 2012-12-04T20:33:13.510 に答える