2016-12-05 48 views
3

我是新來的node.js,我只是不知道如何來之前另一個函數執行setTimeout函數運行任務,中的NodeJS序列

例如,

var async = require('async'); 
function hello(){ 
    setTimeout(function(){ 
     console.log('hello'); 
    },2000);} 

function world(){ 
    console.log("world"); 
} 
async.series([hello,world()]); 

和輸出總是世界問好。

我在使用這個庫嗎?我不是這個問題似乎微不足道,但我真的不知道如何強制一個短任務後運行一長的

+0

幾個問題:1)表達式'世界()''執行立即world'(這樣做是*之前*'hello'被稱爲有史以來)2)'hello'返回* * setTimeout完成之前。對於異步的使用,需要使用'callback'-idiom。請參閱http://stackoverflow.com/questions/15969082/node-js-async-series-is-that-how-it-is-supposed-to-work - 這解釋了與世界()'的問題,並顯示使用的回調參數。 – user2864740

+0

所以,不:你正在使用庫錯誤(而不是正確解釋行爲)。按照文檔並搜索示例。 – user2864740

回答

3

Async要求您使用callback。按照this鏈接查看一些示例。下面的代碼應該輸出hello world正確:

var async = require("async"); 
function hello(callback) { 
    setTimeout(function(){ 
     console.log('hello'); 
     callback(); 
    }, 2000); 
} 

function world(callback) { 
    console.log("world"); 
    callback(); 
} 

async.series([hello, world], function (err, results) { 
    // results is an array of the value returned from each function 
    // Handling errors here 
    if (err) { 
     console.log(err); 
    } 
}); 

注意callback()被稱爲setTimeout()函數中,使其等待console.log('hello')

-1

你可以使用回調,這是nodejs的核心。

var fun1 = function(cb){ 
// long task 
// on done 
return cb(null, result); 
} 

var fun2 = function(cb){ 
return cb(null, data); 
} 

fun1(function(err, result){ 
if(!err){ 
    fun2(function(er, data){ 
    // do here last task 

    }) 
} 
} 

// to avoid pyramid of doom use native promises 

func1(){ 
return new Promise((resolve, reject) => { 
    // do stuff here 
    resolve(data) 
}) 

} 
func2(){ 
    return new Promise((resolve, reject) => { 
    resolve(data); 
    }) 
} 

,然後用打電話給他們:

func1.then((data) => { 
return func2(); 
}) 
.then((resule) => { 
//do here stuff when both promises are resolved 
}) 
+0

回答應該在'async'(它本身使用這種回調)的上下文中,因爲它被給出了。這顯示了死亡塔的基礎,並沒有用原始代碼解釋問題。 – user2864740

+0

比你可以只使用承諾!你甚至不需要使用異步庫來做這件事,或者你也可以使用yield來讓你的代碼更具可讀性。 –

+0

謝謝你們!我將更多地研究回調,因爲我是nodejs的新手,並且不太瞭解語法! –

-1

您可以使用promise而不是回調函數。所以你的代碼將如下所示:

var async = require('async'); 
    function hello(){ 
    setTimeout(function(){ 
     console.log('hello'); 
    },2000);} 

    function world(){ 
    console.log("world"); 
     } 
    return Q.fcall(function() { 
     hello(); 
    }) 
    .then(function(resultOfHelloFunction){ 
     world(); 
}); 

World()函數只會在hello()函數完成執行時執行。

P.S:我正在使用Q庫到promisify函數。使用其他庫(如藍鳥)來實現同樣的事情是完全正確的。

+0

自從他問「異步」給他一個關於承諾的答案沒有多大意義。 – Paul

+0

謝謝你!從來不知道承諾! –

0

使用承諾

function hello(){ 
    return new Promise(function(resolve, reject) { 
     console.log('hello'); 
     resolve(); 
    }); 
} 

function world(){ 
    return new Promise(function(resolve, reject) { 
     console.log("world"); 
     resolve(); 
    }); 
} 


    hello() 
    .then(function(){ 
    return world() 
    }) 
    .then(function(){ 
    console.log('both done'); 
    }) 
    .catch(function(err){ 
    console.log(err); 
    }); 
+0

謝謝!有用! –

+0

你可以請upvote和標記我的答案是正確的,如果它適合你@ParosKwan –