JavasScriptCore异步回调

JavasScriptCore异步回调

问题描述:

我试图找出一种方法来执行一些JavaScript,并通过完成块返回结果,但由于某种原因,回调从不触发。JavasScriptCore异步回调

+ (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破解)。

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

我想问题是JavaScriptCore中没有setTimeout函数。你可以自己写,也可以寻找一些类似的库(自我推销!)https://github.com/artemyarulin/JSCoreBom

P.S. 它至少有setTimeout的非常好的主意,因为多对多的,许多图书馆正在使用

P.P.S 使用JSContext setExceptionHandler为了赶上这样的

错误

似乎像setTimeout和setInterval这样的函数在JavaScriptCore中不可用,并且由于它的沙盒特性,我假设我不需要任何异步函数,因此只需要return并且完成它; )