2012-03-06 11 views
0

私のコードでは、オブジェクトメソッドをコールバックし、そのコールバックからデータを取り出し、別のメソッドまたは関数に渡す必要があります。javascriptオブジェクトメソッドコールバックから変数を取得

someObject.getSomeData({option1:'value1', option2:'value2'}, 
    function(data) { 
     doAwesomeStuff(data); 
    } 
); 

ただし、コールバックはスコープ外の関数/オブジェクト/変数を認識しません。

今私がしようとしたことは、関数のすべてをラップすることです。

var myData = ''; 
(function(myData) { 
    someObject.getSomeData({option1:'value1', option2:'value2'}, 
     function(data) { 
      myData = data; 
     } 
    ); 
}); 
doAwesomeStuff(myData); 

しかし、これはうまくいきません。

これを正しく行う方法を知っている人はいますか?

+1

"範囲外"と言ってどの変数を参照していますか? – pimvdb

+1

>ただし、コールバックはスコープ外の >関数/オブジェクト/変数を認識しません。それはちょっと変わったようです... doAwesomeStuff()はどこに定義されていますか? あなたの電話がかけられている範囲(またはより広い範囲)にある場合は、それは到達可能でなければなりません。 – mamoo

+0

実際に定義されて実行されましたが、これはnodejsにあり、データ処理を行っていました。実行されたことを確認するconsole.outステートメントがあるうちに、他の出力に失われたようです。私は質問を掲示して急いでいるように見えます、私は学校でそれをしました、私は家に帰るとすぐにそれを理解し、それを新鮮に見ました。あなたの助けてくれてありがとう、私は削除や何かのためにフラグを立てます:) –

答えて

3

あなたは本当に私たちが十分にそこに行くために与えられていないが、この文は:

しかし、コールバックはその範囲外の任意の関数/オブジェクト/変数を認識しません。

...が間違っています。関数はそれが定義のスコープ内のすべてへのアクセス権を持っているので、例えば:

var a = 10; 
function foo(b) { 
    bar(5); 
    function bar(c) { 
     alert(a + b + c); 
    } 
} 
foo(12); // alerts "27" 

barは、最も外側からcにするだけでなく、bへ(fooへの呼び出しから)だけでなく、アクセスとaを(持っていましたかスコープが表示されます)。

あなたの例では、コールバックとして渡している無名関数は、定義されているスコープにあるすべてのものにアクセスできます。他の場所で定義されたdoAwesomeStuffはおそらく異なる情報にアクセスできるので、コールバックに必要なデータを渡す必要があります。

だから私はあなたのコードを推測しているが、このようなものになります。

function doAwesomeStuff(data) { 
    // ... 
} 

function doSomethingNifty() { 
    var a = 10, 
     b = 20; 
    someObject.getSomeData({option1:'value1', option2:'value2'}, 
     function(data) { 
      doAwesomeStuff(data); 
     } 
    ); 
} 

を...そして、あなたはdoAwesomeStuffdoSomethingNiftyへの呼び出しからabへのアクセス権を持っていると思います。もしそうなら、唯一のオプションは引数として(おそらく最高の)引数としてそれらに渡すか、変数doSomethingNiftydoAwesomeStuff(おそらく理想的ではなく、あまりにもグローバルに似ている)を変数にエクスポートすることです。

+0

あなたは正しいですが、それは何か異なった、フィードバックのための感謝でした!上記の私のコメントを参照してください詳細 –

1

bind asyncメソッドに渡される関数に必要な変数があります。

また、this SO questionは、トピックの良好な取り扱いをしています。 (。コールバックが呼び出されたまでではない)

あなたはしようとしているので、あなたの第二のバージョンはまだ利用できないデータ、直ちに、すべてで動作するようにアクセスを行っていない

+0

あなたはコールバックについて正しいです、私はそれを把握することができました:)私の関数は、不十分に定義されていた上記の質問に私のコメントを参照してください –

1

あなたの最初の方法:

someObject.getSomeData({option1:'value1', option2:'value2'}, 
    function(data) { 
     doAwesomeStuff(data); 
    } 
); 

は正常です。何が動作していないのか詳細をご記入ください。

getSomeData()が実際にコールバック関数を呼び出さないという問題が1つあります。

doAwesomeStuff()は、受信したデータからさまざまな変数を変更できます。 doAwesomeStuff()がアクセスできる変数は、その変数が利用可能だった変数です(スコープ)。

+0

あなたは正しいが、それフィードバックに感謝しています。私の独自の質問で上記の私のコメントを参照してください詳細 –

関連する問題