[node-sync is a simple library that allows you to call any asynchronous function in synchronous way.]
nodejs的最大特點,事件驅動,異步非阻塞,有且只有一個線程。
(1)異步的初步理解
nodejs包含大量異步過程和回調函數(callback),下面的代碼實現了ls的功能。
# functions like ls command
# result <filenames of ./> <end> <filenames of ./>
fs = require 'fs'
filenames = fs.readdirSync '.'
for filename in filenames
console.log filename
fs.readdir '.', (_err, filenames)->
for filename in filenames
console.log filename
console.log 'end'
PS:如果我們需要使用異步函數的結果,必須在回調函數中調用
(2) 順序執行邏輯不同的異步函數
這種情況較爲多見,一般分爲兩種情況:
- 第一個異步函數的結果是第二個(異步)函數的參數
這種情況比較簡單,只需要層層回調就可以了,大體框架如下:
- 第一個異步函數的處理結束後才能調用第二個(異步)函數
(3)順序執行邏輯相同異步函數
執行邏輯相同的異步函數時,上面(2)中的層層調用的方法並不優雅,但同一般寫法不同,這時nodejs使用while,break語句會報錯。此時,可以使用函數嵌套函數的方法。例子如下:
# Don't try to do this with 'while' and 'break'
# This's a example of asynchronous function nested asynchronous function
http = require "http"
# 獲取某url的數據
getdata = (_url, _callback) ->
http.get _url, (_res)->
_body = ""
_res.on 'data', (_chunk) ->
_body += _chunk
_res.on 'end', ->
try
_stat = JSON.parse _body
catch _e
process.stderr.write _e
process.exit 1
if not _callback
console.log _stat
else
_callback _stat
" "
# 獲得多個url的數據
request = (_urls, _ret, _callback = null)->
_url = _urls.shift()
getdata _url[1], (_data)->
_ret[_url[0]] = _data
_callback = console.log if not _callback
return _callback _ret if _urls.length is 0
request _urls, _ret, _callback
module.exports = {getdata, request}
request方法中,獲取的data存在_ret中,並作爲參數傳遞給再次調用的request函數直到urls遍歷完成。