链承诺并在错误WinJS上爆发

时间:2012-12-04 18:43:20

标签: winjs promise

在WinJS中,如果您需要“突破”链条,那么将承诺链接起来的正确方法是什么?例如,如果你有.then()函数和最终的.done()。从之后返回错误的正确方法是什么?

考虑以下伪代码示例

 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,他们应该点击第一个错误(“No File”);然而,这仍然会调用下一个.then(text),这也会返回错误('no text'),因为文本未定义。整个doSomething()。done()错误处理程序在这里返回“No File”,这是我所期望的,但是调试显示代码仍然调用了“err('No Text')”部分的promise。此时是否可以实际退出承诺链?我应该在这里看一下如何使用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);
        });

3 个答案:

答案 0 :(得分:4)

使用WinJS.Promise.wrapError将错误返回到承诺链。

在你的例子中,如果真正的“错误”浮出水面,你可以选择在最后处理错误。

这也让你有机会“纠正”错误,并允许“成功案例”继续 - 如果你从链中途的错误处理程序返回一个值,那将是沿着传播的值传播的值。成功链。

答案 1 :(得分:0)

我不完全确定,但只是尝试调用err('No text')而不是“return err('...')”。

答案 2 :(得分:-1)

如果你要使用winjs.promise.wraperror,你应该提供像这样的错误处理程序

somepromise()
.then(
        function(){ return someAsyncop()},
        function(error){
         somelogfunction("somepromise failed");
         return WinJS.Promise.wrapError(error);
        })
.then(
        function(){ somelogfunction("someAsyncop done ok"); return WinJS.Prmoise.wrap();},
        function(error){
         somelogfunction("someAsyncop failed"); return WinJS.Promise.wrap();
        })
.done(function(){ //dosomtehing });


或使用try catch构造

try{
somepromise()
.then(  function(){ return someAsyncop()})
.then(  function(){
         somelogfunction("someAsyncop done ok");
         return WinJS.Prmoise.wrap();}
     )
.done( function(){ //dosomtehing});
}
catch(e){
        somelogfunction(e.message);
}