Асинхронный обратный вызов JavasScriptCore

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

+ (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); })()"];

}

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

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

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


person oskob    schedule 21.01.2015    source источник


Ответы (2)


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

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

P.P.S. Используйте JContext setExceptionHandler, чтобы отлавливать подобные ошибки.

person John    schedule 22.01.2015

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

person oskob    schedule 22.01.2015