【问题标题】:Async method in NodeJSNodeJS 中的异步方法
【发布时间】:2014-12-05 09:17:30
【问题描述】:

我想在 NodeJS 中使用 Async() 进行添加,但它不起作用...

我的代码:

    var id = request.params.id;
    var self = this;
    var total;
    var asyncTasks = [];

asyncTasks.push(function(callback){
  self.orderDao.getAllOfUser(id).success(function (orders) {
    orders.forEach( function(order){
      total = total + order.price; // here I'd like to make the addition
      console.log(total);
    });
  });
  callback();
});

    async.parallel(asyncTasks, function(){
      self.orderDao.getAllOfUser(id).success(function (orders) {
        response.render('order/index', {orders: orders, total: total});
      });
    });

total 的结果:NaN

【问题讨论】:

  • 与您的问题无关,但 callback(); 不应该向上移动一个块吗?然后在您的查询和循环完成时调用它。现在async.parallel 的回调可能会在您的查询有时间完成之前执行。

标签: node.js asynchronous node-async


【解决方案1】:

在脚本的顶部,您可以:

var total;

这将使用值undefined 初始化变量:typeof total === "undefined"; //true

当你这样做时:

total = total + order.price;

你实际上正在这样做:

total = undefined + someNumber

NaN,因为 undefined+5 不是数字。

要解决此问题,请将脚本顶部的声明更改为:

var total = 0;

您也可以(但不必)将循环中的加法缩短为:

total += order.price;

【讨论】:

    【解决方案2】:

    这是并行完成的,在您尝试在 getAllOfUser(id) 开始后立即调用第一个回调而不等待响应。幸运的是,您的完成回调运行了足够长的时间以完成总聚合:

    var id = request.params.id;
    var self = this;
    
    async.parallel({
      total: function(callback){
        self.orderDao.getAllOfUser(id).success(function (orders) {
          var total=0;
          orders.forEach( function(order){
            total = total + order.price; // here I'd like to make the addition
            console.log(total);
          });
          callback(null, total);
        });
      },
      orders: function (callback) {
        self.orderDao.getAllOfUser(id).success(function (orders) {
          callback(null, orders);
        });
      }
    }, function(err, res){
      response.render('order/index', {orders: res.orders, total: res.total});
    });
    

    但是有一个更好的解决方案,您不需要执行两次 getAllOfUser。喜欢:

    var id = request.params.id;
    var self = this;
    var total=0;
    self.orderDao.getAllOfUser(id).success(function (orders) {
      orders.forEach( function(order){
        total = total + order.price; // here I'd like to make the addition
        console.log(total);
      });
      response.render('order/index', {orders: orders, total: total});
    });
    

    【讨论】:

      猜你喜欢
      • 2020-05-30
      • 1970-01-01
      • 2015-12-21
      • 2020-05-13
      • 2012-02-09
      • 2012-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多