2012-04-30 60 views
48

Tôi đang sử dụng nút async lib - https://github.com/caolan/async#forEach và muốn lặp qua một đối tượng và in ra khóa chỉ mục của nó. Sau khi hoàn thành, tôi muốn thực hiện một cuộc gọi lại.Node.js - Sử dụng async lib - async.foreach với đối tượng

Dưới đây là những gì tôi có cho đến nay nhưng 'iterating done' không bao giờ được nhìn thấy:

async.forEach(Object.keys(dataObj), function (err, callback){ 
     console.log('*****'); 

    }, function() { 
     console.log('iterating done'); 
    }); 
  1. Tại sao chức năng chính thức không được gọi?

  2. Làm cách nào để in khóa chỉ mục đối tượng?

Trả lời

114

Chức năng cuối cùng không được gọi vì async.forEach yêu cầu bạn gọi callback chức năng cho mỗi phần tử.

Sử dụng một cái gì đó như thế này:

async.forEach(Object.keys(dataObj), function (item, callback){ 
    console.log(item); // print the key 

    // tell async that that particular element of the iterator is done 
    callback(); 

}, function(err) { 
    console.log('iterating done'); 
}); 
+0

Cảm ơn @stewe Tôi biết đó là một cái gì đó đơn giản! Trân trọng, Ben. – Ben

+3

Mã trên không gọi hàm 'callback' cho mỗi lần lặp lại? Nó nên là một cái gì đó như 'đếm ++; if (dataObj.length == count) callback(); 'trong đó biến mới' var count = 1; 'được khai báo trước khi gọi vòng lặp" async.forEach'? –

+1

Cảm ơn rất nhiều vì điều này! –

0

async.each là rất hữu ích và chức năng mạnh mẽ được cung cấp bởi Async Lib .it có 3 lĩnh vực 1 thu/mảng 2- lặp 3-callback bộ sưu tập được gọi là mảng hoặc tập hợp các đối tượng và lặp lại là tham chiếu đến mỗi lần lặp lại và gọi lại là tùy chọn. nếu chúng tôi đang gọi lại thì nó sẽ trả về phản hồi hoặc nói kết quả mà bạn muốn hiển thị cho bạn trong giao diện người dùng

Áp dụng hàm iteratee cho từng mục trong coll, song song. Các iteratee được gọi với một mục từ danh sách, và một cuộc gọi lại khi nó đã kết thúc. Nếu iteratee chuyển một lỗi tới callback của nó, callback chính (cho mỗi hàm) được gọi ngay lập tức với lỗi. Lưu ý rằng vì chức năng này áp dụng lặp lại cho từng mục song song, nên không đảm bảo rằng các hàm lặp lại sẽ hoàn thành theo thứ tự.

exapmle-

var updateEventCredit = function (userId, amount ,callback) { 
    async.each(userId, function(id, next) { 
    var incentiveData = new domain.incentive({ 
    user_id:userId, 
     userName: id.userName, 
     amount: id.totalJeeneePrice, 
     description: id.description, 
    schemeType:id.schemeType 
    }); 

    incentiveData.save(function (err, result) { 
     if (err) { 
      next(err); 
     } else { 
       domain.Events.findOneAndUpdate({ 
        user_id: id.ids 
       }, { 
        $inc: { 
         eventsCredit: id.totalJeeneePrice 
        } 
       },{new:true}, function (err, result) { 
        if (err) { 
         Logger.info("Update status", err) 
         next(err); 
        } else { 
        Logger.info("Update status", result) 
        sendContributionNotification(id.ids,id.totalJeeneePrice); 
        next(null,null);  
        } 
       }); 
     } 
    }); 
Các vấn đề liên quan