【问题标题】:JavaScript Exception Is Lost In Promise ChainJavaScript 异常丢失在 Promise 链中
【发布时间】:2015-02-04 00:54:39
【问题描述】:

我是 JavaScript 承诺的新手,我正在尝试将它们实现到 Android 设备上的一些 PhoneGap 代码中。我想记录异常,看起来异常被吞没了。请参阅下面的示例代码。由于调用不存在的函数“thiswillfail”而引发的异常不会在任何地方显示。我注释掉了不相关的代码并添加了代码来强制调用 AddRecord 承诺。代码检查记录是否存在,如果不存在,则返回错误所在的 AddRecord 承诺。我没有使用任何 3rd 方库。我做错了什么?

编辑:如果我在链“DoSomethingWithRecord”中添加另一个承诺,则当期望跳到捕获时调用此承诺。

function TestPromiseExceptionHandling() {
var record = null;
var CheckForRecord = function () {
    return new Promise(function (resolve, reject) {
        //getData(
        //    function (data) {
        var data = "";
        if (data != "") {
            //record = new Record(data);
            record = "existed";
            resolve();
        }
        else return AddRecord();
        //    },
        //    function (err) {
        //        reject(new Error("An error occurred retrieving data, msg=" + err.message));
        //    });
    });
};
var AddRecord = function () {
    return new Promise(function (resolve, reject) {
        thiswillfail();
        //add record
        var success = true;
        record = "new";
        if (success) resolve();
        else reject(new Error("add record failed"));
    });
};
var DoSomthingWithRecord = function () {
    return new Promise(function (resolve, reject) {
        alert(record);
        resolve();
    });
};


try {
    CheckForRecord()
        .then(DoSomthingWithRecord())
        .catch(function (err) { alert(err.message);})
        .then(function () { alert("done"); });
} catch (err) {
    alert(err.message);
}}

【问题讨论】:

    标签: javascript android promise


    【解决方案1】:

    当你这样做时,你不能从 Promise 构造函数返回:

    else return AddRecord();
    

    什么都不会等待 AddRecord,相反,你想用 AddRecord 来解决,它会在解决 promise 之前等待它:

    else resolve(AddRecord());
    

    但是,如果这是您的代码,您可以只使用return AddRecord() 而不是使用 promise 构造函数。 Promise 构造函数(新 Promise)对于将非 Promise API 转换为 Promise 非常有用,并且不应该与已经 Promise 的 API 一起使用。请改用thens。

    【讨论】:

    • 另外,thisWillFail 必须抛出失败,promise 只能通过 throw/return 值或通过 promise 构造函数中的 reject/resolve 知道失败(同样——你可能不应该在这里使用)
    • 感谢您查看此内容。您的建议似乎解决了异常被吞下的问题,但我仍然没有看到预期的行为。我故意添加了 thisWillFail 行(它不存在)以导致异常。预期的行为是链中的所有其他 Promise 都将被跳过,异常将在 .catch 中捕获并且 alert("done") 应该执行。异常现在被捕获,但它在 try/catch 中被捕获,而不是在 .catch 中。此外,DoSomethingWithRecord 仍会执行,而 alert("done") 不会。很奇怪。
    • 我使用 q.js 尝试了这个精确的测试,一切都按预期工作。 .catch 中捕获了异常,DoSomethingWithRecord 没有执行,我收到了警报。我不确定这是否与我尝试实现本机承诺的方式或限制有关,但由于我与 Q 一起使用它,所以我会坚持下去。
    猜你喜欢
    • 2014-11-03
    • 1970-01-01
    • 2011-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多