Ich versuche Versprechungen in node.js zu verstehen. Hier ist ein BeispielcodeVerständnis der Ablehnung von Versprechen in 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);
});
Der Code ist recht einfach. Allerdings habe ich eine Verwirrung. Wenn return Promise.reject()
aufgerufen wird, wohin würde die Funktion führen, welcher Code wird aufgerufen. Zum Beispiel, wenn die erste catch-Klausel aufgerufen und ruft sie zurückkehren Promise.reject(), wo ein Teil des Code unten danach
Promises in for-Schleife
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,
});
});
korrigiert mich wenn ich falsch liege, aber es sollte nur eine 'catch()' Methodenaufruf in der Kette sein. Wenn Sie nach jedem Schritt Fangfehler unterstützen möchten, sollten Sie den Fehler-Callback als zweiten Parameter in der 'then()' Methode angeben. – sunpietro
Nur ein Hinweis: Die Verwendung von '.spread()' wird abgeraten, wenn Sie ES2015-Syntax haben, verwenden Sie stattdessen '.then (([rows, fields]) => {...})' stattdessen. –
@MadaraUchiha Warum wird abgeraten? Performance? – thefourtheye