2012-07-10 83 views
1

我似乎無法理解回調的概念。在我忍受之前,我沒有和他們一起工作過。爲了讓我的手變溼,我試圖用zombie.js登錄到twitter。Node.js回調

下面是一個例子:

var Browser = require("zombie"); 
var browser = new Browser({ debug: true}) 

browser.visit("https://mobile.twitter.com/session/new", function (callback) { 
    browser.fill("username", "xxxxx"); 
    browser.fill("password", "xxxxx"); 
    browser.pressButton("Sign in", function (err, success) { 
     if(err){ 
      console.log(browser.text('.message')); 
      console.log('There has been a error: ' + err); 
     } 
     else{ 
      console.log('Worked!'); 
     } 

    }); 
}); 

在browser.pressButton部分,這將決定我是否已經能夠成功登錄與否,取決於是否.message包含文本「打字您的手機臭,我們知道!請仔細檢查您的用戶名和密碼,然後重試。「

但是,我不明白它是如何決定觸發回調err。如果.message不存在於html中,那麼我想觸發成功回調以轉到下一個函數。

回答

3

約定殭屍似乎用於回調來自node.js,其中第一個參數是一個錯誤對象,成功時應該是null,任何後續參數都用於成功案例。如果你定義了一個回調函數,你正在使用的庫(在這種情況下是殭屍)將在他們的異步操作完成時執行你的回調函數。當您調用回調時,意味着「確定,操作已完成,您現在可以按照您認爲合適的方式處理結果」。您的代碼需要查看第一個參數以確定操作是成功還是失敗。

當您接受回調函數作爲參數,然後執行一些(可能是異步)操作時,回調是告訴調用庫已完成的方式,並再次使用第一個參數來區分錯誤與成功。

您的困惑的一部分可能來自您的回調browser.visit的函數簽名是錯誤的。您需要命名的第一個參數,清楚顯示是這樣的一個錯誤:

browser.visit("https://mobile.twitter.com/session/new", function (error, browser) { 

因此,在這種匿名的回調函數體,如果殭屍無法加載該頁面中,error參數將有關於信息錯誤。如果頁面確實加載正確,error將爲空,browser第二個參數可用於進一步告訴殭屍在頁面上做更多的事情。這就是殭屍如何說:「我已經完成了visit的操作,你有時間處理結果。」

visit不傳遞迴調參數,您將匿名函數作爲參數傳遞給visit是回叫。 (雖然沒有人做),你可以這樣編寫代碼的時候澄清

browser.visit("https://mobile.twitter.com/session/new", function callback(error, browser) { 

所以這是一個回調時庫需要告訴你它完成。你不要調用它。庫調用它,並將代碼放入其中。另一方面,當您的代碼執行異步操作時,您需要適當地調用作爲函數參數接收的回調函數,以告訴調用者您已完成並且它是否成功失敗。在這種情況下,您不會執行任何自己的異步代碼,因此您無需調用任何回調函數。

+0

謝謝,彼得!偉大的迴應..所以我應該做的是檢查登錄失敗並調用一個函數? loginFailed() - >哪個console.log的輸出失敗 – 2012-07-10 04:26:15

+0

對。在這種情況下,不正確的憑證仍然會導致HTTP 200 OK響應(就殭屍而言是成功的),所以當'pressButton'完成時,您需要確定您是剛剛獲得主頁(成功)還是仍然在登錄頁面上顯示錯誤消息(失敗)。你可以通過檢查文檔並記錄它的任何部分對你有意思。 – 2012-07-10 04:59:29