我正在开发一个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;
答案 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)
目标/行动,代表,通知,方法。他们在被召唤时都会做点什么。定时器,执行选择器。他们可以控制何时。
因此,您可以使用计时器触发某些事件发生,您只需要决定何时启动计时器以及它的作用。