2011-06-28 3 views
0

を保持しつつ、文字列としてコールバック関数を渡し、私はURLでアプリにコールバック関数を渡している:のUIWebViewを使用したiPadアプリの場合はスコープチェーン

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=ja)で質問すると、すぐに回答が得られるかもしれません。 – 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

関連する問題