2011-06-28 14 views
0

對於iPad應用程序使用一個UIWebView,我傳遞一個回調函數到應用程序中的URL:傳遞一個回調函數作爲一個字符串,同時保留範圍鏈

function query(db, query, callback) { 
    var iframe = document.createElement("IFRAME"); 

    // Filter comments from the callback (as this would break things). 
    var callbackstr = "" + callback; 
    callbackstr = callbackstr.replace(/\/\*.+?\*\/|\/\/.*(?=[\n\r])/g, ''); 

    // Put the query + the callback in an url that will be caught by the iOS app. 
    iframe.setAttribute("src", "ios-query:#iOS#" + query +":#iOS#"+ callbackstr); 
    document.documentElement.appendChild(iframe); 
    iframe.parentNode.removeChild(iframe); 
    iframe = null;  
} 

該應用程序解析回調函數從URL中調用,並通過stringByEvaluatingJavaScriptFromString插入一些數據來調用回調函數。這一切工作正常。

不過,現在我想在回調函數中使用閉包,就像這樣:

  var callback = function (problemdata) { 
       // Return the 'real' callback. 
       return function (tx, results) { 
        // Do something with problemdata 
       } 
      }(problemdataFromScopeChain) 

這是有問題的。由於回調函數被轉換爲一個字符串,所有範圍鏈信息都會丟失。

有關如何解決此問題的任何建議?

編輯:

我寧願在'查詢'功能一側的解決方案。例如:是否有任何方法將範圍鏈中的變量轉換爲eval()字符串?

+0

如果您在[iPhone WebDev羣組](https://groups.google.com/group/iphonewebdev/topics?hl=zh-CN)上詢問,您可能會很快得到答案。 – RobG

+0

不錯的建議,謝謝! – TinkerTank

回答

0
var problemdataFromScopeChain = 4; 
var callback = function(problemdata){ 
    // Return the 'real' callback. 
    //return function (tx, results) { 
    // // Do something with problemdata 
    // return tx + results + problemdata; 
    //} 
    return new Function('tx', 'results', 'return tx + results + ' + problemdata + ';'); 
}(problemdataFromScopeChain); 
alert('' + callback); 

但在我看來,使用像這樣的函數構造函數不是很好=)。 https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function

3

而不是將回調函數本身傳遞給查詢頁面,你可以不傳遞一個標識到一個回調數組中的索引的ID嗎?

例如

var callback = function(problemdata){ 
// Do stuff 
}; 

callbacks = []; 
callbacks.append(callback); // so index of 0 

現在,您提供的查詢IFRAME SRC與回調指數,而不是實際的回調函數

最後,您的查詢服務器端腳本可以沿

線返回的東西
callbacks[0]("this is a load of JSON for example"); 
+0

更好的方法=) – Prusse

+0

雖然,這確實需要您控制服務器端腳本。 –

+0

問題在於回調被異步調用,並且同時可能有多個「正在運行」的多個任務。我可以使用全局變量來存儲函數,或者甚至只是'problemData',但是這會將我的問題移動到存儲正確數據的正確數組中正確的索引。 – TinkerTank

相關問題