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)})