Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/43.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_Asynchronous - Fatal编程技术网

嵌入嵌套回调函数的Javascript技术

嵌入嵌套回调函数的Javascript技术,javascript,node.js,asynchronous,Javascript,Node.js,Asynchronous,我正在用Nodejs构建一个应用程序。我对前端javascript相当熟练,异步事件很少会变得太复杂,也不会太深入。但现在我使用的节点都是事件驱动的,对相互依赖的不同服务器和数据库进行大量调用变得相当集群化 将next()函数作为参数传递似乎是常见的做法,在第一个事件完成后调用该函数。这很好用,但是当需要一个接一个的下一个函数时,我很难保持代码的可读性 让我举例说明。 假设我有一条如下定义的路线: app.use('/fetchData', function(req, res) { });

我正在用Nodejs构建一个应用程序。我对前端javascript相当熟练,异步事件很少会变得太复杂,也不会太深入。但现在我使用的节点都是事件驱动的,对相互依赖的不同服务器和数据库进行大量调用变得相当集群化

将next()函数作为参数传递似乎是常见的做法,在第一个事件完成后调用该函数。这很好用,但是当需要一个接一个的下一个函数时,我很难保持代码的可读性

让我举例说明。

假设我有一条如下定义的路线:

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);}
嵌套回调。或者使用承诺进行调用,只返回一次结果(例如,not
app.use