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

Failing promise gets catched by the Application.onerror function

本文关键字:函数 onerror Application promise 会被 失败      更新时间:2023-09-26

有一个奇怪的行为,我不知道它是应该发生的还是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处理程序会被"调用"。

这就是应该的工作方式吗?我错过了什么?

这是一个完整的项目,有一个repro,以防有人想看一看。

我终于在您的GitHub问题中调试了这个问题。这是因为WinJS.UI.Pages.render隐式创建了一个页面,默认情况下,该页面有一个创建错误承诺的错误处理程序,应用程序将其检测为"未处理的错误承诺",因为它没有任何继续。

你现在可以用这样的东西来解决它:

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

只有.done能够捕获并抛出错误。

请参见此处:http://msdn.microsoft.com/en-us/library/windows/apps/br211867.aspx差异。

正如你所看到的,两者几乎完全相同,除了这一点:"在处理程序完成执行后,这个函数抛出任何从那时起作为错误状态下的承诺返回的错误。"这只出现在.done.中

试着用一个done来代替你,看看它是否有效。

看看这个:http://msdn.microsoft.com/en-us/library/windows/apps/br229728.aspx

promise.then(onComplete, onError, onProgress).done( /* Your success and error handlers */ );

on完整

类型:功能

如果某个值成功实现了promise,则要调用的函数。值为作为单个参数传递。如果该值为null,则该值为返回。从函数返回的值变为已实现到那时,承诺的价值已经返回如果在该函数正在执行,然后返回的promise将移动进入错误状态

所以基本上发生这种情况是因为.done 的onCompleted参数为null

试着用一个函数代替