Javascript技术嵌入嵌套回调函数

时间:2014-10-14 19:52:48

标签: javascript node.js asynchronous

我正在使用Nodejs构建应用程序。我非常流利的前端JavaScript,异步事件很少变得太复杂,不会那么深。但是现在我正在使用Node,它是所有事件驱动的,对所有依赖于彼此的不同服务器和数据库进行大量调用变得相当集群。

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

显然第二个实际运行该函数并将第二个设置为返回值。但我似乎可以将正确的信息传递给第二位。

我认为一个选项可能是通过一组回调并始终调用数组中的最后一个函数并将其删除。

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

你的技术是什么?阵列的想法是否在上面指出了最佳解决方案?

1 个答案:

答案 0 :(得分:0)

我建议你使用promises作为个人偏好我喜欢使用bluebird它很容易实现,它有一个非常好的性能,还有一些很酷的功能可以玩用。

有了承诺,它更容易阅读控制流执行(至少对我来说),很多人抱怨回调地狱并承诺它是可能的解决方案之一。

你可以这样做:

发件人:

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

你可以看看这个答案,看看你如何处理比回调容易得多的nested承诺。

我希望有所帮助。