了解node.js中的promise拒绝

时间:2016-09-28 06:24:56

标签: 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);
  });

代码非常简单。但是我有一个困惑。如果正在调用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,
                    });            
            });

1 个答案:

答案 0 :(得分:6)

每次执行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
});