嵌入嵌套回调函数的Javascript技术
我正在用Nodejs构建一个应用程序。我对前端javascript相当熟练,异步事件很少会变得太复杂,也不会太深入。但现在我使用的节点都是事件驱动的,对相互依赖的不同服务器和数据库进行大量调用变得相当集群化 将next()函数作为参数传递似乎是常见的做法,在第一个事件完成后调用该函数。这很好用,但是当需要一个接一个的下一个函数时,我很难保持代码的可读性 让我举例说明。 假设我有一条如下定义的路线:嵌入嵌套回调函数的Javascript技术,javascript,node.js,asynchronous,Javascript,Node.js,Asynchronous,我正在用Nodejs构建一个应用程序。我对前端javascript相当熟练,异步事件很少会变得太复杂,也不会太深入。但现在我使用的节点都是事件驱动的,对相互依赖的不同服务器和数据库进行大量调用变得相当集群化 将next()函数作为参数传递似乎是常见的做法,在第一个事件完成后调用该函数。这很好用,但是当需要一个接一个的下一个函数时,我很难保持代码的可读性 让我举例说明。 假设我有一条如下定义的路线: app.use('/fetchData', function(req, res) { });
app.use('/fetchData', function(req, res) {
});
因此,在返回数据之前,我需要进行一些异步调用
- 首先到数据库检索登录详细信息
- 然后使用登录详细信息,我需要再次调用外部服务器登录并检索原始信息
- 第三,我需要回到数据库做一些检查 然后最后将数据返回给用户
app.use('/fetchData', function(req, res) {
//First I create a user object to pass information around to each function
var user = {...};
var third = database.doSomeChecks;
var second = server.externalCall(user, third);
//first
database.getLoginDetails(user, second);
});
var user = {...};
var third = database.doSomeChecks;
var second = server.externalCall(user, third);
var user = {...};
checkDB(query).then(
function(data){
//data checks
return value
}).then(
function(value){
// value returned from the previous promise
return server.externalCall(value);
});
显然,second实际运行函数并将second设置为返回值。但我似乎能把正确的信息传递给第二个人
我认为的一个选择是通过回调数组,始终调用数组中的最后一个函数并将其删除
app.use('/fetchData', function(req, res) {
//First I create a user object to pass information around to each function including the req and res object to finally return information
var user = {...};
var third = database.doSomeChecks;
var second = server.externalCall;
//first
database.getLoginDetails(user, [third, second]);
});
你的技巧是什么?上面提到的阵列想法是最好的解决方案吗?我建议您将承诺作为个人偏好使用。我喜欢使用它。它易于实现,性能非常好,还具有一些很酷的功能 有了承诺,就更容易阅读控制流执行(至少对我来说),许多人抱怨回调地狱,并承诺这是可能的解决方案之一 您可以这样做: 发件人:
app.use('/fetchData', function(req, res) {
//First I create a user object to pass information around to each function
var user = {...};
var third = database.doSomeChecks;
var second = server.externalCall(user, third);
//first
database.getLoginDetails(user, second);
});
var user = {...};
var third = database.doSomeChecks;
var second = server.externalCall(user, third);
var user = {...};
checkDB(query).then(
function(data){
//data checks
return value
}).then(
function(value){
// value returned from the previous promise
return server.externalCall(value);
});
至:
app.use('/fetchData', function(req, res) {
//First I create a user object to pass information around to each function
var user = {...};
var third = database.doSomeChecks;
var second = server.externalCall(user, third);
//first
database.getLoginDetails(user, second);
});
var user = {...};
var third = database.doSomeChecks;
var second = server.externalCall(user, third);
var user = {...};
checkDB(query).then(
function(data){
//data checks
return value
}).then(
function(value){
// value returned from the previous promise
return server.externalCall(value);
});
你可以看看这个答案,看看你如何处理承诺,这些承诺比回访容易得多
我希望这能有所帮助。使用承诺……承诺,或者你可以检查包装。承诺一路走来。看看q.js.youwant
function second(err,loginResults){server.externalCall(user,third);}
嵌套回调。或者使用承诺进行调用,只返回一次结果(例如,notapp.use
)