JavaScript例外在承诺链中丢失

时间:2014-12-05 19:04:05

标签: javascript android promise

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

编辑:如果我在链“DoSomethingWithRecord”中添加另一个promise,则当期望跳过catch时调用此promise。

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

1 个答案:

答案 0 :(得分:0)

当你这样做时,你无法从promise构造函数返回:

else return AddRecord();

没有什么会等待AddRecord,相反,你想用AddRecord来解决,它会在解决诺言之前等待它:

else resolve(AddRecord());

但是,如果这是您的代码,您只需return AddRecord()而不是使用promise构造函数。 promise构造函数(新的Promise)主要用于将非承诺API转换为承诺,并且不应该与已经使用过的API一起使用。请改用then