运行 带有回调的 JS 时 JavascriptCore 挂起
JavascriptCore hangs when running a JS with callback
我正在尝试 运行 使用来自 Objective-C 的 JavascriptCore 的 JS 函数。这是 JS 代码:
var FeedParser = require('feedparser');
var run = function(data, options){
var feedparser = new FeedParser(options);
feedparser.on('readable', function() {
if(callback){
callback(this.read());
}
});
feedparser.end(data);
};
module.exports = {
run: run
};
这里是调用 JS 的 Objective-C 代码:
NSString *path = [[NSBundle mainBundle] pathForResource:@"rss" ofType:@"js"];
NSStringEncoding encoding;
NSError *error = nil;
NSString *js = [NSString stringWithContentsOfFile:path
usedEncoding:&encoding
error:&error];
JSContext *context = [[JSContext alloc] init];
[context setExceptionHandler:^(JSContext *context, JSValue *value) {
NSLog(@"%@", value);
}];
context[@"callback"] = ^(JSValue *val){
@try{
if([val isString]){
NSLog(@"%@", [val toString]);
} else if([val toDictionary][@"0"]){
NSLog(@"%@", [val toArray]);
} else {
NSLog(@"%@", [val toDictionary]);
}
}
@catch(NSException *e){
}
};
[context evaluateScript:js];
JSValue *parse = context[@"rss"][@"run"];
[parse callWithArguments:@[data, o]];
注:
- 需要说明的是,这种方法适用于立即 return 结果的所有其他 JS 函数。我正在使用 browserify 将它们全部打包到一个 JS 中。我只是注意到通过回调异步 return 的函数存在问题。 (注意我在上下文中添加了
callback
函数。
- 当我在 XCode 上 运行 它挂起(不仅是应用程序而且 XCode 编辑器本身,并且它永远不会恢复,直到我从 [=38 中终止进程=] 监视器).
- 然而,出于某种原因,当我从笔记本电脑上拔下 iPhone 时,它 return 就是结果。 (此时XCode在我杀掉它之前还处于悬崖状态)
- 与 XCode 分离后,应用程序 运行 正常。它只是在 运行ning 从 XCode 调用 运行.
时挂起
可能您正在尝试通过 toDictionary 调用将某些 JavaScript 值转换为 NSDictionary。该方法尝试递归转换值,因此经常导致挂起。我怀疑在这种情况下,任何带有循环引用的 JS 值都会导致无限递归。尝试直接使用 JSValue。
我正在尝试 运行 使用来自 Objective-C 的 JavascriptCore 的 JS 函数。这是 JS 代码:
var FeedParser = require('feedparser');
var run = function(data, options){
var feedparser = new FeedParser(options);
feedparser.on('readable', function() {
if(callback){
callback(this.read());
}
});
feedparser.end(data);
};
module.exports = {
run: run
};
这里是调用 JS 的 Objective-C 代码:
NSString *path = [[NSBundle mainBundle] pathForResource:@"rss" ofType:@"js"];
NSStringEncoding encoding;
NSError *error = nil;
NSString *js = [NSString stringWithContentsOfFile:path
usedEncoding:&encoding
error:&error];
JSContext *context = [[JSContext alloc] init];
[context setExceptionHandler:^(JSContext *context, JSValue *value) {
NSLog(@"%@", value);
}];
context[@"callback"] = ^(JSValue *val){
@try{
if([val isString]){
NSLog(@"%@", [val toString]);
} else if([val toDictionary][@"0"]){
NSLog(@"%@", [val toArray]);
} else {
NSLog(@"%@", [val toDictionary]);
}
}
@catch(NSException *e){
}
};
[context evaluateScript:js];
JSValue *parse = context[@"rss"][@"run"];
[parse callWithArguments:@[data, o]];
注:
- 需要说明的是,这种方法适用于立即 return 结果的所有其他 JS 函数。我正在使用 browserify 将它们全部打包到一个 JS 中。我只是注意到通过回调异步 return 的函数存在问题。 (注意我在上下文中添加了
callback
函数。 - 当我在 XCode 上 运行 它挂起(不仅是应用程序而且 XCode 编辑器本身,并且它永远不会恢复,直到我从 [=38 中终止进程=] 监视器).
- 然而,出于某种原因,当我从笔记本电脑上拔下 iPhone 时,它 return 就是结果。 (此时XCode在我杀掉它之前还处于悬崖状态)
- 与 XCode 分离后,应用程序 运行 正常。它只是在 运行ning 从 XCode 调用 运行. 时挂起
可能您正在尝试通过 toDictionary 调用将某些 JavaScript 值转换为 NSDictionary。该方法尝试递归转换值,因此经常导致挂起。我怀疑在这种情况下,任何带有循环引用的 JS 值都会导致无限递归。尝试直接使用 JSValue。