失败的承诺会被Application.onerror函数捕获

时间:2014-10-07 01:22:13

标签: javascript windows-phone-8.1 promise winjs winjs-promise

有这种奇怪的行为,我不知道它是否应该发生,或者它是错误。

我正在使用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。

3 个答案:

答案 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

尝试用功能替换它