Javascript无法找到变量回调

时间:2013-08-13 21:51:37

标签: javascript

我正在开发一个node.js应用程序,我正在运行我的app.js中的javascript代码,并且该函数正常运行,并且所有卡宾枪都通过该函数传递,但我的回调永远不会返回。

脚本运行,并且一切都会出现在console.log中,但是当我运行带错误的函数时,回调不是回调:

ReferenceError: Can't find variable: callback    

这是代码。

    var username;
    var password;

    function getBalance(username,password,callback) {
    console.log("info that main.js received: ",username,password);
    try {
      var Spooky = require('spooky');
    } catch (e) {
      var Spooky = require('../lib/spooky');
    }




    var spooky = new Spooky({
      child: {
          transport: 'http',
          "ssl-protocol": "any"
      },
      casper: {
          logLevel: 'debug',
          verbose: true
      }
    }, function(err) {
      if (err) {
          e = new Error('Failed to initialize SpookyJS');
          e.details = err;
          throw e;
      }

      spooky.start('https://bank.simple.com/signin');

      spooky.then([{
    auth: username+"_"+password
    }, function () {
    this.evaluate(function (auth) {
    var info = auth.split("_");
    username = info[0];
    password = info[1];

      document.getElementById("login_username").value = username;
              document.getElementById("login_password").value = password;
    }, {
      auth:auth
    });

    }]);
      spooky.thenClick('#signin-btn', function() {
          this.emit('notifForTitleChange', 'Hello, from ' + this.evaluate(function() {


              return document.title;
          }));
      });

      spooky.thenOpen('https://bank.simple.com/account/balances');

      spooky.then([{
    },function() {
              var pre = document.getElementsByTagName("pre")[0];
    callback(pre.innerHTML);
      }]);


      spooky.run();

    });



    spooky.on('error', function(e, stack) {
      console.error(e);

      if (stack) {
          console.log(stack);
      }
    });


    spooky.on('console', function(line) {
      console.log(line);
    });


    spooky.on('valueChanged', function(greeting) {
      console.log(greeting);
    });

    spooky.on('gotInfo', function(balance) {
      console.log(balance);


//Note: this callback isn't getting called    :


    callback(balance);
    });


    spooky.on('log', function(log) {
      if (log.space === 'remote') {
          console.log(log.message.replace(/ \- .*/, ''));
      }
    });
    };



    module.exports.getBalance = getBalance;

2 个答案:

答案 0 :(得分:2)

如果屏幕上有很多可以接收触摸的视图,并且您想要检测其中任何一个没有触摸,则可以使用UIApplication的子类。

当用户触摸屏幕时,系统会通过向您应用的sendEvent:对象发送UIApplication消息来告知您的应用。在sendEvent:中,应用程序会确定哪个窗口应该触摸,并将触摸传递到该窗口。

因此,您可以通过继承UIApplication并覆盖sendEvent:来查看每个触摸事件。让我们创建UIApplication的子类,在最后一次触摸结束或取消时发布通知。

首先,我们将创建一个名为MyApplication的新类。在MyApplication.h中,我们声明了要发布的通知名称的常量:

extern NSString *const LastTouchEndedNotification;

@interface MyApplication : UIApplication

@end

MyApplication.m中,我们将定义通知名称变量:

#import "MyApplication.h"

NSString *const LastTouchEndedNotification = @"LastTouchEnded";

如果事件代表最后一次触摸的结束(或取消),我们需要一个查看UIEvent并返回YES的函数:

static BOOL lastTouchEndedInEvent(UIEvent *event) {
    NSSet *touches = event.allTouches;
    if (touches.count == 0)
        return NO;
    for (UITouch *touch in touches) {
        switch (touch.phase) {
            case UITouchPhaseBegan:
            case UITouchPhaseMoved:
            case UITouchPhaseStationary:
                return NO;
            default:
                break;
        }
    }
    // There was at least one touch, and all touches either Ended or Cancelled.
    return YES;
}

现在我们可以实施MyApplication。在sendEvent:中,我们调用super照常传递事件,然后我们查看事件是否代表最后一次触摸的结束。如果是,我们发布通知:

@implementation MyApplication

- (void)sendEvent:(UIEvent *)event {
    [super sendEvent:event];
    if (lastTouchEndedInEvent(event)) {
        [[NSNotificationCenter defaultCenter] postNotificationName:LastTouchEndedNotification object:self];
        NSLog(@"all touches ended");
    }
}

@end

我们需要修改main.m以使用我们的新类,方法是将类名作为UIApplicationMain的第三个参数传递:

int main(int argc, char * argv[]) {
    @autoreleasepool {
        return UIApplicationMain(argc, argv,
            NSStringFromClass([MyApplication class]),
            NSStringFromClass([AppDelegate class]));
    }
}

最后,为了响应通知,您可以添加一个对象(可能是视图控制器)作为通知的观察者。例如:

#import "MyApplication.h"

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(lastTouchDidEnd:) name:LastTouchEndedNotification object:nil];
}

- (void)lastTouchDidEnd:(NSNotification *)note {
    [self.someView removeFromSuperview];
}

答案 1 :(得分:1)

目标/行动,代表,通知,方法。他们在被召唤时都会做点什么。定时器,执行选择器。他们可以控制何时。

因此,您可以使用计时器触发某些事件发生,您只需要决定何时启动计时器以及它的作用。