我试图了解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,
});
});
答案 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
});