我刚刚开始开发nodejs。我很困惑使用异步模型。我相信有一种方法可以将大多数SYNC用例转换为ASYNC方式。例如,通过SYNC,我们加载一些数据并等待它返回,然后将它们显示给用户;通过ASYNC,我们加载数据并返回,只需告诉用户数据将在稍后呈现。我可以理解为什么在这种情况下使用ASYNC。
但是我有一个用例。我正在构建一个Web应用程序,允许用户下订单(购买东西)。在将订单数据保存到db之前,我想将一些用户数据与订单数据放在一起(顺便说一下,我使用的是文档NoSql db)。所以我认为通过SYNC,在获得订单数据后,我对数据库进行SYNC调用并等待其返回的用户数据。在我获得返回的数据后,将它们集成在一起并摄取到db。
我认为如果我向db调用用户数据进行ASYNC调用可能会出现问题,因为在将数据保存到db之后可能会返回用户数据。这不是我想要的。
所以在这种情况下,我怎么能异步做这件事?
答案 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闭包提供了跨函数保持变量状态的方法。
异步编程当然还有更多功能,当你编写更多涉及异步代码时,有辅助模块可以帮助实现基本结构,如链,并行,连接等。但这可能会给你一个快速的想法。