2014-10-10 61 views
0

我想使用以異步的NodeJS()加成,但它不工作...異步方法的NodeJS

我的代碼:

結果的 total
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}); 
     }); 
    }); 

:NaN的

+0

與你的問題無關,但不應'callback();'向上移動一個塊?然後當你的查詢和循環完成時它會被調用。現在'async.parallel'的回調可能會在查詢有時間完成之前執行。 – RikkusRukkus 2014-10-10 09:13:02

回答

1

這是如何與並行完成的,在您嘗試第一個回調被調用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}); 
}); 
+0

是的,它的工作原理,謝謝。 – tonymx227 2014-10-10 09:20:46

0

在你的腳本的頂部,你這樣做:

var total; 

這與初始化值變量:typeof total === "undefined"; //true

當你這樣做:

total = total + order.price; 

你實際上這樣做:

total = undefined + someNumber 

這是NaN,因爲不確定+ 5不是一個數字。

爲了解決這個問題,改變聲明在腳本頂部:

var total = 0; 

你也可以(但不必)縮短了另外的循環中:

total += order.price;