node.js - Node.js 回调后会继续执行语句吗?

标签 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) => {

    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 只是查询数据库,另一个发出通知,另一个保留一些数据等。

关于node.js - Node.js 回调后会继续执行语句吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49598055/

相关文章:

asynchronous - 在 Meteor.call 回调中对 sys.exec 的 Meteor 回调

c++ - Linux C++ : libaio callback function never called?

node.js - Nodejs Express 多次回调错误

javascript - Nodejs 和快速路由,如何处理客户端 promise

node.js - 错误 : Procfile does not exist, 和启动 Web 进程时出现问题

node.js - 命令行应用程序的 Node 框架?

objective-c - 以 block 作为参数的方法的函数头约定/预期样式

java - 对于任何产品来说,选择 Nodejs 而不是 ASP.NET 或 Java 有何缺点?

java - 异步同步

jquery - Ember : this. get 返回一个 getter (而不是我真正想要的对象)