简体   繁体   中英

JavaScript Exception Is Lost In Promise Chain

I am new to JavaScript promises and I am trying to implement them into some PhoneGap code on an Android device. I want to log exceptions and it looks like exceptions are swallowed somewhere. See the sample code below. The exception thrown due to the call to the non-existent function "thiswillfail" does not show anywhere. I commented out the irrelevant code and added code to force the AddRecord promise to be called. The code checks if a record exists and, if not, return the AddRecord promise which is the error is. I am not using any 3rd party libraries. What am I doing wrong?

Edit: If I add another promise in the chain "DoSomethingWithRecord", this promise is called when the expectation is to skip to the catch.

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

You can't return from the promise constructor, when you do:

else return AddRecord();

Nothing will wait for AddRecord, instead, you want to resolve with AddRecord which will wait for it before resolving the promise:

else resolve(AddRecord());

However, if this is your code you can just return AddRecord() instead of using the promise constructor anyway. The promise constructor (new Promise) is mostly useful for converting non-promise APIs to promises and aren't supposed to be used with already promisified APIs. Use then s instead.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM