如何与nodejs异步思考?

时间:2015-06-05 03:51:37

标签: node.js mongodb asynchronous express callback

我刚刚开始开发nodejs。我很困惑使用异步模型。我相信有一种方法可以将大多数SYNC用例转换为ASYNC方式。例如,通过SYNC,我们加载一些数据并等待它返回,然后将它们显示给用户;通过ASYNC,我们加载数据并返回,只需告诉用户数据将在稍后呈现。我可以理解为什么在这种情况下使用ASYNC。

但是我有一个用例。我正在构建一个Web应用程序,允许用户下订单(购买东西)。在将订单数据保存到db之前,我想将一些用户数据与订单数据放在一起(顺便说一下,我使用的是文档NoSql db)。所以我认为通过SYNC,在获得订单数据后,我对数据库进行SYNC调用并等待其返回的用户数据。在我获得返回的数据后,将它们集成在一起并摄取到db。

我认为如果我向db调用用户数据进行ASYNC调用可能会出现问题,因为在将数据保存到db之后可能会返回用户数据。这不是我想要的。

所以在这种情况下,我怎么能异步做这件事?

2 个答案:

答案 0 :(得分:0)

这里有几件事。首先,如果您的应用程序已经拥有用户数据(用户已经登录),则此信息应存储在会话中,这样您就不必访问该数据库。如果您允许用户在购买时进行注册,您只需要传递一个回调函数,该函数可以处理将订单保存到保存用户数据的调用中。如果没有具体了解您的代码是什么样的,那么这就是您要寻找的东西。

function saveOrder(userData, orderData, callback) {
  // save the user data to the DB
  db.save(userData, function(rec) {
    // if you need to add the user ID or something to the order...
    orderData.userId = rec.id; // this would be dependent on your DB of choice
    // save the order data to the DB
    db.save(orderData, callback);
  });
}

答案 1 :(得分:0)

同步代码就是这样的。一步一步 - 一个接一个。可以有ifs和loop(for)等我们所有人都可以得到它。

fetchUserDataFromDB();
integrateOrderDataAndUserData();
updateOrderData();

将nodejs的异步编程视为事件驱动。与UI编程一样 - 代码(函数)在事件发生时执行。例如。在click事件上 - 框架回调已注册的clickHandler

nodejs异步编程也可以在这些行上考虑。当db query(async)执行完成时,将调用您的回调。更新订单数据时,将调用您的回调。上面的代码是这样的:

function nodejsOrderHandler(req,res)
{
    var orderData;
    db.queryAsync(..., onqueryasync);
    function onqueryasync(userdata)
    {
        // integrate user data with order data
        db.update(updateParams, onorderudpate);
    }
    function onorderupdate(e, r)
    {
        // handler error
        write response.
    }
}

javascript闭包提供了跨函数保持变量状态的方法。

异步编程当然还有更多功能,当你编写更多涉及异步代码时,有辅助模块可以帮助实现基本结构,如链,并行,连接等。但这可能会给你一个快速的想法。