-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:メッセージを送信してアプリに通知します。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クラス名を の 3 番目の引数として渡すことにより、新しいクラスを使用するように変更する必要があり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 に答える