在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);
});
答案 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);
}