作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图找出一种方法来执行一些 Javascript 并通过完成 block 返回结果,但由于某种原因,回调永远不会触发。
+ (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); })()"];
}
一旦我尝试使其异步,在此处通过使用超时进行模拟,则永远不会调用 context[@"done"] 中的 block 。
我扩展了 JSContext 以确保它在超出范围时不会被释放(因此是 __black hack)。
我是不是用错了方法?
最佳答案
我猜问题出在 JavaScriptCore 中没有 setTimeout 函数。您可以自己编写它,也可以为此寻找一些现有的库( self 提升!)https://github.com/artemyarulin/JSCoreBom
附言至少有 setTimeout 确实是个好主意,因为很多很多库都在使用它
P.P.S使用 JSContext setExceptionHandler 来捕捉这样的错误
关于ios - JavasScriptCore 异步回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28062179/
我试图找出一种方法来执行一些 Javascript 并通过完成 block 返回结果,但由于某种原因,回调永远不会触发。 + (void)doSomethingWithCompletionHandle
我是一名优秀的程序员,十分优秀!