【发布时间】:2017-02-05 23:03:32
【问题描述】:
我正在尝试理解 node.js 中的承诺。这是一个示例代码
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 子句被调用并且它调用 return 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,
});
});
【问题讨论】:
-
如果我错了,请纠正我,但链中应该只有一个
catch()方法调用。如果你想支持在每一步之后捕获错误,那么你应该在then()方法中提供错误回调作为第二个参数。 -
请注意:当您使用 ES2015 语法时,不鼓励使用
.spread(),请改用.then(([rows, fields]) => { ... })。 -
@MadaraUchiha 为什么不鼓励?性能?
-
@thefourtheye 可能,但我认为这与便携性有关。
.spread()仅在 Bluebird 中可用,而.then(([]) =>在所有 Promise 实现中可用。
标签: javascript node.js promise