2011-10-19 21 views
1

私は関数から返されたオブジェクトリテラルを持っていますが、このオブジェクトはiframeを作成し、そのiframe内にDOMがロードされるといくつか行います。私は、イベントがトリガされたときにコールバックによって返される値を「取得」できるようにしたい。ここでは簡略化の目的である:addEventListenerでのjavascriptコールバックの理解

var myFunc = function (url) { 
    return { 
     url: url, 
     myMethod: function() { 

      // some code here to create my iframe. 

      var callbackFunc = function (event) { 
      // do some stuff with the dom. 
      return aValueAsynchronously; 
      }; 

      var async = my_iframe.addEventListener("DOMContentLoaded", callbackFunc, true); 
      my_iframe.src = this.url; 
     }  
    } 
} 

それの外従うように、このコードを読んだ後、私はそれを使用している:

var myValue = myFunc.myMethod('http://www.example.org'); 

とexample.orgはiFrameの、DOMContentLoadedコールバックローディング行われるとトリガされ、値(あるロジックの後)が返されます。この値をmyValue(上記の行)に割り当てる方法を教えてください。私はそれを行うためにコールバックを使う必要があることを理解していますが、どこでどのように?

ありがとうございました!

答えて

0

まず、関数値にmyMethodプロパティがないため、表示したコードをmyFunc.myMethodで呼び出すことはできません。代わりに、関数は、そのプロパティを持つオブジェクトを返します。したがって、まずはコールバックを設定するメソッドを呼び出すだけです:

var myValue = myFunc('http://foo.com').myMethod(); 

私は、IFRAMEのコールバックから実行するために自分自身のコールバックに渡すことができるように、私は個人的にコードを記述し、しかしその代わりの

var myFunc = function(url){ 
    var aValueAsynchronously; 
    return { 
    val : aValueAsynchronously, 
    myMethod: function(){ 
     var callback = function(evt){ 
     aValueAsynchronously = ...; 
     }; 
     ...register your callback... 
    } 
    }; 
}; 

var obj = myFunc('http://foo.com'); 
obj.myMethod(); 
...some time passes, and eventually the callback occurs... 
console.log(obj.val); // This will be what was set in your callback 

、:実際aValueAsynchronouslyへのアクセスを持っているあなたは、その値の周りにクロージャを作成することができます、特別な値を自分のコールバックに直接渡すだけです。 (それは混乱に聞こえる;以下のコードを参照してください。)あなたは値が利用可能になるまで待つ必要はありませんが、むしろそれがあるときは、通知を得るその方法:

var myFunc = function(url,whenDone){ 
    return { 
    myMethod: function(){ 
     var callback = function(evt){ 
     var aValueAsynchronously = ...; 
     whenDone(aValueAsynchronously); 
     }; 
     ...register your callback... 
    } 
    }; 
}; 

var myObj = myFunc('http://foo.com',function(specialValue){ 
    // use specialValue here 
}); 
myObj.myMethod(); // Go 
+0

あなたの答えをありがとう!あなたが記述した2つのソリューションを試して、その仕組みを見てみましょう! :-) –

+0

コールバックの値を直接渡して2番目の解決策を愛してください!それは本当にJSの強さを実証しています!再度、感謝します! –

0

myValueのためのスコープ内にある場合callBack、それに割り当てます。スコープ内にない場合は、あるオブジェクトのプロパティとしてアクセスする必要があり、そのオブジェクトへの参照がコールバックのスコープに含まれている必要があります。単純なケースで

myValueはグローバルであり、あなたがブラウザで実行するためのコードを期待している、そしてコールバックwindow.myValue = ...;を設定することができます。それ以外の場合は、コールバックはグローバルオブジェクトのプロパティとしてアクセスする必要があります(これはブラウザでウィンドウに相当します)。

だからあなたの機能であなたが持っているかもしれません:

 var callbackFunc = function (event) { 
     // do some stuff with the dom. 

     window.myValue = aValueAsynchronously; 

     return aValueAsynchronously; 
     }; 

または私は完全にポイントを逃していましたか?

+0

ありがとうございますが、私はブラウザでこれを実行していません! Phrogzソリューションが機能しました。 –

+0

次に、グローバルオブジェクトへの参照を取得し、代わりにそのグローバルオブジェクトを使用できます。しかし、はい、私はPhrogzがそれを得たと思います。 – RobG

関連する問題