1

我似乎无法掌握回调的概念。我以前没有和他们合作过,所以请耐心等待。为了弄湿我的手,我正在尝试使用zombie.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。如果.messagehtml 中不存在,那么我想触发成功回调以移动到下一个函数。

4

1 回答 1

3

Zombie 用于回调的约定似乎来自 node.js,其中第一个参数是一个错误对象,它应该是null成功的,任何后续参数都是针对成功案例的。如果你定义了一个回调,你正在使用的库(在这种情况下是 Zombie)将在它们的异步操作完成时执行你的回调函数。当你的回调被调用时,它意味着“好的,一个操作已经完成,你现在可以处理你认为合适的结果”。您的代码需要查看第一个参数来确定操作是成功还是失败。

当您接受回调函数作为参数然后执行一些(可能是异步的)操作时,回调是您告诉调用库您已完成的方式,并再次使用第一个参数来区分错误和成功。

您的部分困惑可能来自于您的回调函数签名browser.visit错误这一事实。您需要命名第一个参数以清楚地表明它是这样的错误:

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

因此,在该匿名回调函数的主体中,如果僵尸无法加载该页面,则error参数将包含有关错误的信息。如果页面加载正确,error将为 null 并且browser第二个参数可用于进一步告诉僵尸在页面上做更多的事情。这就是僵尸所说的“我已经完成了visit手术,是时候让你处理结果了。”

visit不传递回调参数,您作为参数传递给visit IS THE CALLBACK的匿名函数。您可以这样编码以澄清(尽管没有人这样做)

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

所以当图书馆需要告诉你它已经完成时,这是一个回调。你不调用它。库调用它,您将代码放入其中。

另一方面,当您的代码执行异步操作时,您需要适当地调用作为函数参数接收到的回调,以告诉调用者您已完成以及失败是否成功。在这种情况下,您无需执行任何自己的异步代码,因此您无需调用任何回调函数。

于 2012-07-10T04:04:37.473 回答