2015-01-21 157 views
0

我試圖找出一種方法來執行一些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破解)。

我接近這個錯誤的方式嗎?

回答

0

我想問題是JavaScriptCore中沒有setTimeout函數。你可以自己寫,也可以尋找一些類似的庫(自我推銷!)https://github.com/artemyarulin/JSCoreBom

P.S. 它至少有setTimeout的非常好的主意,因爲多對多的,許多圖書館正在使用

P.P.S 使用JSContext setExceptionHandler爲了趕上這樣的

錯誤
0

似乎像setTimeout和setInterval這樣的函數在JavaScriptCore中不可用,並且由於它的沙盒特性,我假設我不需要任何異步函數,因此只需要return並且完成它; )