Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/438.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 当数据在范围内时,通过回调函数传递数据_Javascript_Node.js - Fatal编程技术网

Javascript 当数据在范围内时,通过回调函数传递数据

Javascript 当数据在范围内时,通过回调函数传递数据,javascript,node.js,Javascript,Node.js,背景 我的问题是理解作用域以及如何正确使用回调函数。在我试图计划时,我似乎无法把事情按顺序安排好。我很难阅读文章并将其与我当前的问题联系起来。我想我真正不明白的是如何实现逻辑 问题: 在我的应用程序中,有一些场景会给我带来问题。它们都围绕着一种情况,我需要的数据还不在范围之内。但是该函数已经有一个回调函数 范例 此函数用于将数据插入数据库 updateProfile: function (req, res) { pool.getConnection(function (err, c

背景

我的问题是理解作用域以及如何正确使用回调函数。在我试图计划时,我似乎无法把事情按顺序安排好。我很难阅读文章并将其与我当前的问题联系起来。我想我真正不明白的是如何实现逻辑

问题:

在我的应用程序中,有一些场景会给我带来问题。它们都围绕着一种情况,我需要的数据还不在范围之内。但是该函数已经有一个回调函数

范例

此函数用于将数据插入数据库

   updateProfile: function (req, res) {
    pool.getConnection(function (err, connection) {
        var email = req.body.email;
        var sql = 'INSERT INTO rw_users SET email = ?';
        var params = [email];

        connection.query(sql, params, function (err, results, fields) {
            if (err) {
                res.status(500).send();
                throw err;
            }
            connection.release();
        });
    });
},
下一个函数需要刚创建的用户的ID

 createCustomerProfile: function (email, id) {
            merchant.createCustomerProfile(email, id, function callback(merchantRes){
                    pool.getConnection(function (err, connection) {
                var sql = 'UPDATE rw_user SET auth_customer_id = ? WHERE email = ?';
                var params = [merchantRes, email];
                connection.query(sql, params, function (err, results, fields) {
                    if (err) {
                        throw err;
                    }
                    console.log('new customer created at authorize.net');
                });
            });
          });
        }, 
在函数updateProfile中,我正在数据库中创建一个新用户。在第二个函数createCustomerProfile中,我需要在函数1中输入的新创建用户的ID

请告诉我一种处理这种函数的方法。我需要来自第一个进程的数据,以便在第二个函数中使用它。这会变得更糟,因为当函数2完成时,它将在其API调用的响应中有一个新的customerID。该响应还需要进行另一个数据库查询,以使用其ID更新该行。然后,完成这两个函数后,我需要再次查询数据库以返回整行

为了打破这一局面

在数据库中创建用户。 使用在功能1中创建的新用户的id和电子邮件。在函数2中创建具有authorize.net api的新客户帐户id。 将authorize.net API响应中的新客户id插入到函数1中创建的新用户行中。 返回整行。
我的问题很清楚。什么是一个可能的解决方案,可以使用它来处理我的列表中的任务,并清楚地执行它们,以便我可以在范围内使用每个任务的响应

实现程序的最简单方法是使用嵌套回调,但这很容易造成混乱,难以维护代码。 我们可以使用承诺或生成器以更优雅的方式实现这一点。 首先,让我们看一下下面的简单代码

     const test1= () => {
         return new Promise((resolve,reject)=>{
              setTimeout(function(){ <-- async operation
                 resolve(10);
             })
         })
     }

     const test2= (data) => {
         return new Promise((resolve,reject)=>{
                    setTimeout(function(){ <-- async operation
                         resolve(data+20)
                    })
                })
     }

     test1()
     .then(test2)
     .then((finalData)=>{console.log(finalData)});
then方法需要一个函数,我们可以通过resolve函数传递参数。但只需要一个参数,因此如果需要多个参数,则需要对象或数组。如果你能理解上面的代码,让我们重构一下你的代码

     getConnection:function(req,res){
           return new Promise((resolve,reject)=>{
                 pool.getConnection(function (err, connection) {
                        if(err) return reject(err);
                        resolve({connection,req,res});
             });
             })
     },

     updateProfile:function(obj){
         const { connection,req,res } = obj;
         return new Promise((resolve,reject)=>{
             var email = req.body.email;
             var sql = 'INSERT INTO rw_users SET email = ?';
             var params = [email];
             connection.query(sql, params, function (err, results, fields) {
                     if (err) return reject(err);
                     resolve({email,results,connection});
             });
         })
     },

     createCustomerProfile: function (obj) {
                   const { email,results,connection } = obj;
                     return new Promise((resolve,reject)=>{
                         merchant.createCustomerProfile(email, results.id, function callback(merchantRes){
                                 var sql = 'UPDATE rw_user SET auth_customer_id = ? WHERE email = ?';
                                 var params = [merchantRes, email];
                                 connection.query(sql, params, function (err, results, fields) {
                                         if (err) {
                                                 throw err;
                                         }
                                         console.log('new customer created at authorize.net');
                                         connection.release();
                                 });
                     });
                     })
  }

    yourModule.getConnection(req,res)
              .then(yourModule.updateProfile)
              .then(yourModule.createCustomerProfile)
              .catch((err)=>{console.log(err)})

现在,您需要修改此代码,以便与您的模块一起使用

如果它们是两个不同的函数,那么使用callback作为第三个参数来执行CreateCustomerProfile。恐怕您的问题不清楚。您的问题是关于JavaScript如何在异步生成结果时将函数串在一起,还是关于MySQL并在插入后返回信息?另外:请不要提及无关的细节。你的整个第一段和大约一半的文本都是无关的,只会妨碍人们阅读它并为你提供答案。MySQL的问题是否就是这个问题在这里得到了回答:对nodejs MySQL get last id的简单搜索就找到了它。更多关于搜索的信息。对此我很抱歉。是的,我的问题是如何自信地将事件的顺序排列出来。最后我列出的清单是我试图让它更清楚。我非常想了解这一点,所以我不再继续讨论这些问题。你想让我编辑这个问题吗?或者你现在明白我的意思了吗?对于串接,看看承诺,很快就会看到新的async/await语法,但现在是承诺。
     getConnection:function(req,res){
           return new Promise((resolve,reject)=>{
                 pool.getConnection(function (err, connection) {
                        if(err) return reject(err);
                        resolve({connection,req,res});
             });
             })
     },

     updateProfile:function(obj){
         const { connection,req,res } = obj;
         return new Promise((resolve,reject)=>{
             var email = req.body.email;
             var sql = 'INSERT INTO rw_users SET email = ?';
             var params = [email];
             connection.query(sql, params, function (err, results, fields) {
                     if (err) return reject(err);
                     resolve({email,results,connection});
             });
         })
     },

     createCustomerProfile: function (obj) {
                   const { email,results,connection } = obj;
                     return new Promise((resolve,reject)=>{
                         merchant.createCustomerProfile(email, results.id, function callback(merchantRes){
                                 var sql = 'UPDATE rw_user SET auth_customer_id = ? WHERE email = ?';
                                 var params = [merchantRes, email];
                                 connection.query(sql, params, function (err, results, fields) {
                                         if (err) {
                                                 throw err;
                                         }
                                         console.log('new customer created at authorize.net');
                                         connection.release();
                                 });
                     });
                     })
  }

    yourModule.getConnection(req,res)
              .then(yourModule.updateProfile)
              .then(yourModule.createCustomerProfile)
              .catch((err)=>{console.log(err)})