-4

我正在开发一个 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;
4

2 回答 2

2

如果您在屏幕上有很多视图都接收到触摸,并且您想检测它们中的任何一个何时都没有触摸,您可以使用UIApplication.

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

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

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

extern NSString *const LastTouchEndedNotification;

@interface MyApplication : UIApplication

@end

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

#import "MyApplication.h"

NSString *const LastTouchEndedNotification = @"LastTouchEnded";

如果事件代表最后一次触摸的结束(或取消),我们需要一个查看 aUIEvent并返回的函数: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];
}
于 2013-08-13T22:37:48.513 回答
1

目标/动作、委托、通知、方法。当他们被召唤时,他们都会做一些事情。计时器,执行选择器。他们可以控制时间。

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

于 2013-08-13T21:57:56.010 回答