了解node.js中的promise拒绝

Muh*_*mar 3 javascript node.js promise

我试图理解node.js中的promises.这是一个示例代码

con.queryReturnPromise("SELECT * FROM bookings WHERE driverId = " + accId + " AND bookingStatus = " + config.get('BOOKING_STATUS_ACTIVE') + " LIMIT 1")
  .catch((err) => {

    callback({
      "message": "Success",
      "error": true,
    });
    console.log("mysql query error");
    return Promise.reject();
  })
  .spread((rows, fields) => {
    if (rows.length != 1) {
      return Promise.reject();
    }
    mBooking = rows[0];
    var query = "INSERT INTO locations SET timeStamp = " + timeStamp + " latitude = " + lat + ", longitude = " + lng + ", bookingId = " + mBooking.id;
    return con.queryReturnPromise(query)
  })
  .catch((err) => {
    if (err)
      console.log("Adding Location error" + err);
    return Promise.reject();
  })
  .spread(() => {
    return funcs.getBooking(con, mBooking.id)
  })
  .then((booking) => {
    if (mBooking.userId.toString() in userSockets) {
      userSockets[mBooking.userId].emit(config.get('EVENT_USER_UPDATE_BOOKING'), {
        "message": "Success",
        "error": false,
        "booking": booking
      });
      userId = mBooking.userId.toString();
    }
    callback({
      "message": "Success",
      "error": false,
      "booking": booking
    });
  })
  .catch((err) => {
    if (err)
      console.log(err);
  });
Run Code Online (Sandbox Code Playgroud)

代码很简单.但是我有一个困惑.如果return Promise.reject()被调用,函数将在哪里导致,将调用哪个代码.例如,如果第一个catch子句被调用,并且它调用返回Promise.reject(),其中下面代码的一部分将在之后运行

承诺for循环

data = JSON.parse(data);
            var promisesArray = [];
            for (var i = 0; i < data.length; i++) 
            {
                var location = data[i];
                var lng       = location.lng;
                var lat       = location.lat;
                var bearing   = location.bearing;
                var deltaTime = location.deltaTime;
                var timeStamp = location.timeStamp;

                var query = "INSERT INTO locations SET timeStamp = " + timeStamp + " latitude = " + lat + ", longitude = " + lng + ", bookingId = " + mBooking.id;


                var promise = con.queryReturnPromise(query)                    
                        .then( () => {                            
                        });

                promisesArray[] = promise;
            }

            Promise.all(promisesArray)
            .then(function(results)
            {
                    callback({
                        "error": false,
                    });            
            });
Run Code Online (Sandbox Code Playgroud)

jfr*_*d00 10

每次执行时return Promise.reject(),.catch()都会调用该链中的下一个处理程序.它将跳过任何.then()处理程序直到下一个.catch()处理程序.

.then()处理程序或.catch()处理程序返回拒绝承诺会使当前的承诺链被拒绝.因此,当遇到链中更多的处理程序时,链中的下一个拒绝处理程序将被调用.

当你遇到一个.catch()处理程序时,之后发生的事情.catch()取决于它的.catch()作用.如果它抛出或返回被拒绝的promise,则promise将保持在被拒绝状态,并且.catch()链中的下一个将执行.如果它不返回任何内容或任何常规值(除了最终拒绝的承诺),则承诺将被解析(不再被拒绝),然后.then()链中的下一个处理程序将运行.

这是一个例子:

a().then(function() {
    // makes promise chain assume rejected state
    return Promise.reject();
}).then(function() {
    // this will not get called because promise is in rejected state
}).catch(function() {
    // this will get called
    // returning a reject promise will keep the promise in the reject state
    return Promise.reject();
}).then(function() {
    // this will not get called because promise is in rejected state
}).catch(function() {
    // this will get called
    return 2;
}).then(function(val) {
    // this will get called because prior `.catch()` "handled" the rejection
    // already
    console.log(val);    // logs 2
}).catch(function() {
     // this is not called because promise is in resolved state
});
Run Code Online (Sandbox Code Playgroud)

  • @MuhammadUmar - 不.只有该链中的下一个`.catch()`运行.之后``.catch()`取决于`.catch()`返回或抛出的内容.如果它返回一个被拒绝的promise或抛出一个异常,那么下一个`.catch()`将会运行.如果它没有返回任何值或正常值,则promise将被解析,下一个`.then()`处理程序将运行. (2认同)