Node.js会在回调后继续执行语句吗?
我在lambda函数中使用node.js将数据保存到mysql数据库,然后发送推送通知。我希望在保存到数据库之后,在发送推送通知以提高性能之前,有一个回调。但我希望推送代码在回调后继续执行 这就是我所拥有的:Node.js会在回调后继续执行语句吗?,node.js,asynchronous,callback,Node.js,Asynchronous,Callback,我在lambda函数中使用node.js将数据保存到mysql数据库,然后发送推送通知。我希望在保存到数据库之后,在发送推送通知以提高性能之前,有一个回调。但我希望推送代码在回调后继续执行 这就是我所拥有的: const AWS = require('aws-sdk'); var mysql = require('mysql'); var apn = require("apn"); exports.handler = (event, context, callback) => {
const AWS = require('aws-sdk');
var mysql = require('mysql');
var apn = require("apn");
exports.handler = (event, context, callback) => {
var connection = mysql.createConnection({
host: "databaseHost",
user: "databaseUser",
password: "databasePassword",
database: "databaseName",
});
var sql = "INSERT INTO some_table SET some_id = ?";
var inserts = [event.someId];
connection.query(sql, inserts, function (error, results, fields) {
connection.end();
if (error) {
callback(error);
} else {
var options = {
token: {
key: "key.p8",
keyId: "keyId",
teamId: "teamId"
},
production: true
};
var message = "Some Message";
var apnProvider = new apn.Provider(options);
var deviceTokens = event.deviceTokenArray;
var notification = new apn.Notification();
notification.alert = message;
notification.topic = "com.example.example";
apnProvider.send(notification, deviceTokens).then((response) => {
callback(null, event.arguments.input);
});
}
});
};
我想让
apnProvider
函数中的回调发生在该函数之前,但该函数要继续执行。理想情况下,我希望将推送消息放在一个单独的文件中,但我想这是一个不同的问题,稍后我将处理。可能是好的做法,也可能不是,但完全可行。只需回拨并执行其余代码
const AWS = require('aws-sdk');
var mysql = require('mysql');
var apn = require("apn");
exports.handler = (event, context, callback) => {
var connection = mysql.createConnection({ /* .. */ });
var sql = "INSERT INTO some_table SET some_id = ?";
var inserts = [event.someId];
connection.query(sql, inserts, function (error, results, fields) {
connection.end();
if (error) {
callback(error);
} else {
callback(null, event.arguments.input);
// consider moving this out to a separate lambda, the
// function is essentially done
var options = { /* */ };
var message = "Some Message";
var apnProvider = new apn.Provider(options);
var deviceTokens = event.deviceTokenArray;
var notification = new apn.Notification();
notification.alert = message;
notification.topic = "com.example.example";
apnProvider.send(notification, deviceTokens).then((response) => {
console.log('log response here');
});
}
});
};
理想情况下,您很可能希望拆分您的lambda,这样他们就不会做太多。可能有一个lambda正在查询数据库,另一个发出通知,另一个保存一些数据等。如果我将lambda分成两个单独的函数,一个用于查询数据库,另一个用于发送推送,那么在数据库函数返回后,我是否需要从客户端调用推送lambda函数?或者我可以在第一个数据库查询函数中这样做吗?您完全可以从数据库查询函数中调用它。这只是一个函数。出于测试等目的,将其提取到单独的函数中可能是一个好主意。您可能还希望在其他地方调用推送通知逻辑。