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 来捕捉这样的错误
我正在尝试找出一种方法来通过完成块执行一些 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 来捕捉这样的错误