Javascript Node.js回调

Javascript Node.js回调,javascript,node.js,Javascript,Node.js,我似乎无法理解回调的概念。我以前没有和他们一起工作过,所以请容忍我。我想用zombie.js登录twitter 以下是一个例子: var Browser = require("zombie"); var browser = new Browser({ debug: true}) browser.visit("https://mobile.twitter.com/session/new", function (callback) { browser.fill("username", "x

我似乎无法理解回调的概念。我以前没有和他们一起工作过,所以请容忍我。我想用zombie.js登录twitter

以下是一个例子:

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部分,它将根据
确定我是否能够成功登录。消息
包含文本“在手机上键入内容很臭,我们知道!请仔细检查您的用户名和密码,然后重试。”


但是,我不明白它是如何决定启动回调的
err
。如果html中不存在
.message
,则我希望触发成功回调以转到下一个函数

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

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

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

browser.visit("https://mobile.twitter.com/session/new", function (error, browser) {
因此,在匿名回调函数的主体中,如果zombie无法加载该页面,则
error
参数将包含有关错误的信息。如果页面加载正确,
error
将为null,并且可以使用
browser
第二个参数进一步告诉zombie在页面上做更多的事情。僵尸就是这样说的:“我已经完成了
visit
操作,是时候处理结果了。”

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

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


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

谢谢,peter!反应很好。。因此,我应该做的是检查登录是否失败,并调用一个函数?loginFailed()->哪个console.log是failureRight的输出。在这种情况下,不正确的凭据仍然会导致HTTP 200 OK响应(就僵尸而言是成功的),因此当
按Button
完成时,您需要确定您是刚刚获得主页(成功),还是仍在登录页面上并显示错误消息(失败)。您可以通过检查文档并记录您感兴趣的任何部分来实现这一点。
browser.visit("https://mobile.twitter.com/session/new", function callback(error, browser) {