我试图想办法执行一些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)。
我接近这个错误的方式吗?
答案 0 :(得分:1)
我猜问题是JavaScriptCore中没有setTimeout函数。您可以自己编写或寻找一些现有的库(自我推销!)https://github.com/artemyarulin/JSCoreBom
P.S。 至少拥有setTimeout是个好主意,因为很多很多库正在使用
P.P.S 使用JSContext setExceptionHandler来捕获这样的错误
答案 1 :(得分:0)
看起来像setTimeout和setInterval这样的函数在JavaScriptCore中不可用,并且由于它的沙盒特性,我认为我也不需要任何异步函数,所以只需return
和完成它;)