2015-01-21 2 views
0

Я пытаюсь выяснить способ выполнения Javascript и вернуть результат через блок завершения, но по какой-то причине обратный вызов никогда не срабатывает.JavascriptCore асинхронный обратный вызов

+ (void)doSomethingWithCompletionHandler:(void (^)(NSError* error, NSString *result))completionHandler; 
{ 
    JSContext __block *context; 
    context = [[MyJSContext alloc] initWithVirtualMachine:[[JSVirtualMachine alloc] init]]; 
    context[@"done"] = (id) ^(NSString *result) 
    { 
     context = nil; 
     completionHandler(nil, result); 
    }; 

    // this works 
    // [context evaluateScript:@"(function(){ done('immediate'); })()"]; 

    // this does not 
    [context evaluateScript:@"(function(){ setTimeout(function(){ done('delayed'); }, 1000); })()"]; 

} 

Как только я пытаюсь сделать это асинхронным, моделируется здесь с помощью тайм-аута, блок в контексте [@ «сделано»] никогда не вызываются.

Я расширил JSContext, чтобы удостовериться, что он не освобожден, когда он выходит из сферы действия (отсюда __black hack).

Я подхожу к этому неправильно?

ответ

0

Я думаю, проблема в том, что в JavaScriptCore нет функции setTimeout. Вы можете написать это самостоятельно или найти некоторые существующие библиотеки для подобных (самореклама!) https://github.com/artemyarulin/JSCoreBom

P.S. Это действительно хорошая идея, чтобы иметь по крайней мере SetTimeout, потому что многие-многие-многие библиотеки используют, что

P.P.S Использование JSContext setExceptionHandler для того, чтобы поймать ошибки как этот

0

Похоже, что функции, такие как setTimeout и setInterval, недоступны в JavaScriptCore, и, поскольку это связано с песочницей, я предполагаю, что мне также не понадобятся какие-либо функции async, поэтому давайте просто return и сделаем это;)

Смежные вопросы