2012-07-10 85 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