2014-08-28 74 views
0

首先模擬PHP - 在js函數睡眠:async.parallel和async.series有什麼區別?

function sleep(seconds) { 
    var startTime = new Date().getTime(); 
    while (new Date().getTime() < startTime + seconds*1000); 
    } 

然後我的例子:

var async = require('async'); 

var a = function(callback) 
{ 
    sleep(10) 
    console.log("Hello "); 
    callback(null,'vals1') 
    // return 'prop' 
}; 
var b = function(callback) 
{ 
    //I want get return 'prop' from a() its posible ? 
    sleep(30) 
    console.log("World"); 
    callback(null,"vals2") 
}; 

var c = function(callback) 
{ 
    //I want get return 'prop' from a() its posible ? 
    sleep(2) 
    console.log(" and U"); 
    callback(null,"val3") 
}; 
async.parallel(
[ 
    a,b,c 
],function(err,vals){ 

    //console.log(err)//undefined 
    console.log(vals) //[val1,vals2] 
    console.log('finals') 
} 
    ); 

series(tasks, [callback]) 

運行在一系列的任務數組中的功能,每一個運行一次先前的功能已經完成。如果系列中的任何函數將錯誤傳遞給其回調函數,則不會運行更多函數,並立即使用錯誤值調用回調函數。否則,回調會在任務完成時收到一系列結果。

parallel(tasks, [callback]) 

並行運行任務函數數組,無需等到上一個函數完成。如果任何函數將錯誤傳遞給它的回調函數,主回調函數會立即調用錯誤值。一旦任務完成,結果將作爲數組傳遞給最終回調。

我的結果:

break about 10sec 
Hello 

break about 30sec 
World 

and small break 
and U 

我預計將按照以下順序執行的功能:

output immediately 
and U 

break about 10sec 
Hello 

break about 30sec 
World 

如果連更換

async.series() 

您的例子中,結果將是相同

+0

在node.js中實現阻塞睡眠是一個非常糟糕的主意。 – 2014-08-28 10:52:19

+1

如果要爲異步函數調用(例如db查詢)建模,請改用[內建異步'setTimeout'](http://nodejs.org/api/timers.html#timers_settimeout_callback_delay_arg)。 – 2014-08-28 10:54:45

+2

可能重複[Async.js - 並行真的平行嗎?](http://stackoverflow.com/questions/19023977/async-js-is-parallel-really-parallel) – 2014-08-28 10:56:31

回答

1

要回答你的問題:parallel並行運行這些功能,series一個接一個地運行。

您的代碼無法按預期工作,因爲nodejs僅爲所有功能提供一個進程,並且您的功能會「忙等待」。將它們替換爲setTimeout(),您會得到預期的結果...