JavasScriptCore异步回调

时间:2015-01-21 07:58:56

标签: ios objective-c javascriptcore

我试图想办法执行一些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); })()"];

}

一旦我尝试使其异步,通过使用超时模拟此处,上下文中的块[@"已完成"]永远不会被调用。

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

我接近这个错误的方式吗?

2 个答案:

答案 0 :(得分:1)

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

P.S。 至少拥有setTimeout是个好主意,因为很多很多库正在使用

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

答案 1 :(得分:0)

看起来像setTimeout和setInterval这样的函数在JavaScriptCore中不可用,并且由于它的沙盒特性,我认为我也不需要任何异步函数,所以只需return和完成它;)