我是全新的全新品牌 - javascript,node.js,coffeescript,nodeunit。想想我應該一步一步來做?你可能是對的,但我仍然不會去做。在nodeunit中處理異步性的正確方法是什麼?
下面是測試文件:
testCase = require('nodeunit').testCase
Server = require('./web').WebServer
Client = require('../lib/client').Client
Request = require('../lib/request').Request
OPTIONS = {host: 'localhost', port: 8080, path: '/', method: 'GET'}
SERVER = new Server OPTIONS.port
CLIENT = new Client
REQUEST = new Request OPTIONS
SERVER.start() # asynchronous!
module.exports = testCase
setUp: (callback) ->
callback()
tearDown: (callback) ->
callback()
testResponseBodyIsCorrect: (test) ->
test.expect 1
process.nextTick ->
CLIENT.transmit REQUEST #asynchronous!
process.nextTick ->
test.equal REQUEST.body, /Ooga/
test.done()
在內部,它僅僅是圍繞HTTP庫的包裝。我使用節點0.4.11。 這實際上不起作用。這裏有兩個異步調用。如果我在咖啡REPL中手動執行此操作,它可以工作 - 但nodeunit比我快得多,所以我遇到了一些聰明的事情,我會稱之爲競爭條件。 笑容
這裏是「發送」的實施: 的Http =需要的「http」
exports.Client = class Client
transmit: (request, callback = null) ->
req = Http.request request.options, (res) ->
res.setEncoding 'utf8'
res.on 'data', (chunk) ->
request.appendToResponseBody chunk
req.end()
console.log "Request sent!"
我需要確保服務器被綁定到港之前,我運行測試,和我需要確保「.transmit」在完成斷言之前已完成其內部回調以獲取響應。
什麼是乾淨的方式(或至少有效的方式)來做到這一點?
事情開始融合(我喜歡那個詞,很少用它)。我已經編輯了這個問題來添加「傳輸」的實現 - 我相當肯定它是壞的。我想我明白了。所以'迴應'回調是回調,這意味着我應該通過 - 回傳另一個回調沒有意義。正確? – Trevoke
哦!這意味着,如果我想構建更高級的接口,最終,我的客戶端或請求封裝器/接口也應該實現或繼承此類事件,而不是依賴於http的低級別事件。由於http.request()發生在客戶端,事件可能不會神奇地冒出來,對吧? – Trevoke
對,Node的好處在於沒有魔法;一切都在表面上。所以目前,傳遞給'transmit'的'callback'參數永遠不會被調用。你需要的是'res.on'end', - >回調? res',它會在響應被完全接收時將響應傳遞給'callback'函數(如果存在)。 –