2013-04-12 17 views
24
var async = require('async'); 

function callbackhandler(err, results) { 
    console.log('It came back with this ' + results); 
} 

function takes5Seconds(callback) { 
    console.log('Starting 5 second task'); 
    setTimeout(function() { 
     console.log('Just finshed 5 seconds'); 
     callback(null, 'five'); 
    }, 5000); 
} 

function takes2Seconds(callback) { 
    console.log('Starting 2 second task'); 
    setTimeout(function() { 
     console.log('Just finshed 2 seconds'); 
     callback(null, 'two'); 
    }, 2000); 
} 

async.series([takes2Seconds(callbackhandler), 
       takes5Seconds(callbackhandler)], function(err, results){ 
    console.log('Result of the whole run is ' + results); 
}) 

Kết quả trông giống như dưới đây:node.js async.series là cách nó được cho là hoạt động?

Starting 2 second task 
Starting 5 second task 
Just finshed 2 seconds 
It came back with this two 
Just finshed 5 seconds 
It came back with this five 

Tôi đã chờ đợi chức năng takes2Second để kết thúc hoàn toàn trước khi takes5Second bắt đầu. Đó là cách nó được cho là hoạt động. Làm ơn cho tôi biết. Và chức năng cuối cùng không bao giờ chạy. Cảm ơn.

Trả lời

32

Không hoàn toàn. Bạn đang thực hiện các hàm ngay lập tức (ngay khi mảng được đánh giá), đó là lý do tại sao chúng xuất hiện cùng lúc.

Gọi lại được chuyển đến từng chức năng được thực hiện là nội bộ trong thư viện async. Bạn thực hiện nó một khi chức năng của bạn đã hoàn thành, đi qua một lỗi và/hoặc một giá trị. Bạn không cần tự định nghĩa hàm đó.

Hàm cuối cùng không bao giờ chạy trong trường hợp của bạn vì hàm gọi lại mà async cần bạn gọi để chuyển sang hàm tiếp theo trong chuỗi không bao giờ thực sự được thực thi (chỉ chức năng callbackHandler của bạn mới được thực hiện).

Hãy thử điều này thay vì:

async.series([ 
    takes2Seconds, 
    takes5seconds 
], function (err, results) { 
    // Here, results is an array of the value from each function 
    console.log(results); // outputs: ['two', 'five'] 
}); 
+1

James, nhờ giải thích rõ ràng của bạn về những gì đang xảy ra. Nó hoạt động sau khi tôi thực hiện những thay đổi như đề xuất. Có thể chuyển đối số cho các hàm này không? – voicestreams

+3

Khi đọc thêm tài liệu, có vẻ như tôi nên sử dụng async.apply để chuyển đối số vào các hàm. – voicestreams

13

James đưa cho bạn một cái nhìn tổng quan tốt của async.series. Lưu ý rằng bạn có thể thiết lập chức năng ẩn danh trong mảng loạt và sau đó gọi chức năng thực tế của bạn với các thông số

var async = require('async') 
var param1 = 'foobar' 
function withParams(param1, callback) { 
    console.log('withParams function called') 
    console.log(param1) 
    callback() 
} 
function withoutParams(callback) { 
    console.log('withoutParams function called') 
    callback() 
} 
async.series([ 
    function(callback) { 
    withParams(param1, callback) 
    }, 
    withoutParams 
], function(err) { 
    console.log('all functions complete') 
}) 
+0

Noah, Vâng tôi cuối cùng đã tìm ra điều đó. Cảm ơn bạn đã đăng nó. – voicestreams

8

cách ưa thích của tôi để tạo ra các loạt async là sử dụng mảng hoạt động như sau;

var async = require('async'), 
    operations = []; 

operations.push(takes2Seconds); 
operations.push(takes5seconds); 

async.series(operations, function (err, results) { 
    // results[1] 
    // results[2] 
}); 

function takes2Seconds(callback) { 
    callback(null, results); 
} 

function takes5seconds(callback) { 
    callback(null, results); 
} 
+0

Thật thú vị khi bạn đặt hàm .series() lên phía trước. Tôi rất thích điều đó. – tonejac

+0

Làm thế nào để 'async.series' biết rằng một trong các hoạt động đã gặp lỗi? –

6
async.series 
    ([ 
     function (callback) 
     { 
      response=wsCall.post(user,url,method,response); 
      console.log("one"); 
      callback(); 
     } 
     , 
     function (callback) 
     { 
      console.log("two"); 
      //console.log(response); 
      callback(); 
     } 
    ] 
    , 
    function(err) 
    { 
     console.log('Both a and b are saved now'); 
     console.log(response); 
    }); 
+0

Chào mừng bạn đến với SO và cảm ơn câu trả lời của bạn. Câu trả lời này sẽ hữu ích hơn nhiều nếu nó được định dạng đúng và giải thích một chút. Không phải là sự giúp đỡ của bạn không được đánh giá cao, nhưng vì nó đứng câu trả lời của bạn có thể sẽ được gỡ bỏ vì vấn đề chất lượng của nó, mà không có lợi cho bạn hoặc bất cứ ai khác trong cộng đồng. –

0

Trong async.series, tất cả các chức năng được thực hiện trong loạt và các kết quả hợp nhất của mỗi hàm được truyền cho callback thức. ví dụ

var async = require('async'); 
async.series([ 
    function (callback) { 
     console.log('First Execute..'); 
     callback(null, 'userPersonalData'); 
    }, 
    function (callback) { 
     console.log('Second Execute.. '); 
     callback(null, 'userDependentData'); 
    } 
], 
function (err, result) { 
    console.log(result); 
}); 

Output:

First Execute.. 
Second Execute.. 
['userPersonalData','userDependentData'] //result 
Các vấn đề liên quan