簡體   English   中英

JavaScript異常在承諾鏈中丟失

[英]JavaScript Exception Is Lost In Promise Chain

我對JavaScript Promise並不陌生,我正在嘗試在Android設備上將其實現為某些PhoneGap代碼。 我想記錄異常,看起來異常被吞沒在某處。 請參見下面的示例代碼。 由於調用不存在的函數“ thiswillfail”而引發的異常不會在任何地方顯示。 我注釋掉了不相關的代碼,並添加了代碼以強制調用AddRecord Promise。 代碼檢查記錄是否存在,如果不存在,則返回錯誤的AddRecord Promise。 我沒有使用任何第三方庫。 我究竟做錯了什么?

編輯:如果我在鏈“ 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);
}}

當您這樣做時,您不能從promise構造函數返回:

else return AddRecord();

什么都不會等待AddRecord,相反,您要使用AddRecord解決,它將在解決諾言之前等待它:

else resolve(AddRecord());

但是,如果這是您的代碼,則可以只return AddRecord()而不是始終使用promise構造函數。 Promise構造函數(新的Promise)在將非 Promise API轉換為Promise時最有用,並且不應與已承諾的API一起使用。 使用then代替。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM