JavasScriptCore 异步回调

JavasScriptCore asynchronous callback

我正在尝试找出一种方法来通过完成块执行一些 Javascript 和 return 结果,但由于某种原因,回调永远不会触发。

+ (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"] 中的块。

我扩展了 JSContext 以确保它在超出范围时不会被释放(因此 __black hack)。

我是不是用错了方法?

似乎 setTimeout 和 setInterval 之类的函数在 JavaScriptCore 中不可用,并且由于它的沙盒性质,我假设我也不需要任何异步函数,所以让 return 和完成它 ;)

我猜问题出在 JavaScriptCore 中没有 setTimeout 函数。您可以自己编写它,也可以为此寻找一些现有的库(自我推销!)https://github.com/artemyarulin/JSCoreBom

P.S。 至少有 setTimeout 真的是个好主意,因为很多很多库都在使用它

P.P.S 使用 JSContext setExceptionHandler 来捕捉这样的错误