有这种奇怪的行为,我不知道它是否应该发生,或者它是winjs错误。
我正在使用WinJS.UI.Pages.render
在特定元素下呈现页面内容。
我遇到的问题是,无论我处理render
函数的失败,'错误'都会继续传播,并被onerror
函数“捕获”。
以下是我的代码的快速视图:
function goFunction() {
WinJS.UI.Pages.render('otherpage.html', root).then(null, failedNavigating);
}
function noGoFunction() {
WinJS.UI.Pages.render('missingpage.html', root).then(null, failedNavigating);
}
function failedNavigating() {
console.log('failed to navigate');
}
WinJS.Application.onerror = function (args) {
debugger;
};
otherpage.html
页面存在,因此渲染会被执行,一切都很好。但missingpage.html
不存在。在这种情况下,failedNavigating
函数执行到目前为止一直很好,但随后WinJS.Application.onerror
处理程序被'调用'。
这是怎么回事?我错过了什么?
如果有人想看一下,这里有一个完整的project有一个repro。
答案 0 :(得分:2)
我终于在你的GitHub问题中调试了这个。这是因为WinJS.UI.Pages.render隐式创建了一个Page,默认情况下它有一个错误处理程序,它创建一个错误承诺,该应用程序检测到它是一个“未处理的错误承诺”,因为没有任何内容继续发生。
你现在可以通过以下方式解决这个问题:
function noGoFunction() {
WinJS.UI.Pages.define('missingpage.html', {
error: function (e) {
console.log("Page failed to load");
}
});
WinJS.UI.Pages.render('missingpage.html', root).then(null, failedNavigating);
}
function failedNavigating() {
console.log('failed to navigate');
}
答案 1 :(得分:0)
只有.done能够捕获并抛出错误。
请参阅此处:http://msdn.microsoft.com/en-us/library/windows/apps/br211867.aspx了解差异。
正如你所看到的那样,两者几乎完全相同:“处理程序完成执行后,此函数会抛出从那时起作为错误状态的promise返回的任何错误。”这只出现在.done中。
尝试替换你。然后用.done查看它是否有效。
答案 2 :(得分:0)
看看这个:http://msdn.microsoft.com/en-us/library/windows/apps/br229728.aspx
promise.then(onComplete, onError, onProgress).done( /* Your success and error handlers */ );
的onComplete
类型:功能
如果使用值成功完成promise,则调用该函数。价值是 作为单个参数传递。如果值为null,则值为 回。从函数返回的值变为已满足 当时归还的承诺价值。 如果抛出异常 正在执行此函数,然后返回的承诺移动 进入错误状态。
所以基本上会发生这种情况,因为.done
的onCompleted参数中有null尝试用功能替换它