2016-08-16 231 views
1

我明白回調是什麼以及異步意味着什麼,我沒有得到的是如何在節點中運行異步功能。Nodejs如何知道是同步還是異步

例如,這是怎麼

var action = (function(data,callback) { 
    result = data+1; 
    callback(result); 
}); 

http.createServer(function (req, res) { 
    action(5, function(r){ 
     res.end(r.toString()); 
    }); 
}).listen(80); 

從這個

var action = (function(data) { 
    result = data+1; 
    return result; 
}); 

http.createServer(function (req, res) { 
    var r = action(5); 
    res.end(r.toString()); 
}).listen(80); 

不同?

我想在第一個例子中,我正在異步做它,但我不知道節點如何知道什麼時候做同步或異步...是否是返回的問題?或者在同步模式下我們正在做的事實var x = func(data);

還有:何時使用同步或異步?因爲顯然你不想在添加+1時使用它......只是在執行IO任務時才使用異步,比如從DB讀取數據?

例如,我正在使用庫加密來加密一個短字符串(最多50個字符),這是一個很好的例子,我應該已經在使用異步了嗎?

回答

1

我想在第一個例子中,我以異步方式做...

你的第一個例子是不是異步:)只是一個傳遞的回調並調用它,當你做了沒有按」使一個功能異步。

異步意味着,基本上,你告訴節點:「在這裏,爲我做這件事,並讓我知道你什麼時候完成,而我繼續做其他的東西」

你的例子並沒有把任何東西交給Node來完成。它正在進行計算並在此之後立即調用回調。這與您的第二個示例在功能上相同,其中返回計算結果。

但是,您可以在第一個例子改變的東西,異步:

var action = (function(data,callback) { 
    setTimeout(function() { 
    result = data + 1; 
    callback(result); 
    }, 1000); 
}); 

在這裏,你告訴節點延遲調用回調1秒,使用setTimeout。同時,Node不會等待一秒鐘;它會高興地接受更多的HTTP請求,並且在響應發送之前每個請求都會延遲一秒。

何時使用同步或異步?

異步代碼爲「病毒性」:如果你依靠可異步功能,即使用這些功能,你自己的代碼也必須是異步(一般通過接受回調,或使用其他機制來處理異步,就像承諾一樣)。

例如,我正在使用庫加密來加密一個短字符串(最多50個字符),這種情況是一個很好的例子,我應該已經在使用異步了嗎?

這取決於您正在使用的功能。 AFAIK,crypto中的大多數加密函數都不是異步的,所以你不能讓它們自己異步。

+0

好的,那麼我完全誤解了所有的東西......假設我有一個函數做了幾件事情,我希望它在'後面'運行,這樣它就不會阻塞主循環,一旦完成,我想要運行回調操作。那我該怎麼辦?用0ms設置超時? –

+0

@CarlosNavarro可能['setImmediate'](https://nodejs.org/api/timers.html#timers_setimmediate_callback_arg)。但是,您應該意識到使用它不會奇蹟般地讓您的代碼不會阻止事件循環。最後,JS是單線程的,所以它一次只能「做」一件事。 – robertklep

0

這兩個示例都將同步工作。簡單的異步操作是setTimoutsetInterval

節點實際上並不關心你在運行什麼代碼。您可以區塊與否(blocking/non-blocking)。

換句話說 - 你有event loop。如果你的進程是異步的,他會將程序控制傳遞給事件循環,因此它可以執行任何其他需要完成的動作節點。如果沒有 - 他不會。

相關問題