2012-01-26 22 views
2

ないFF Chromeでのみ動作し、私は外の関数内「メニュー」にconsole.logすることはできませんが、array.pushはFFでは動作しませんが、Chromeで動作します...どのようなアイデアですか?

var menu = new Array(); 
    $.couch.db("foo").allDocs({ 
      success: function(d) { 
        for(var i=0;i<=d.total_rows-1;i++){ 
          menu.push(d.rows[i].id); 
        }; 
      } 
    }); 
    console.log(menu); 

。それはその範囲を失うようなものです。何か案は?

+0

コードは見栄えがよく、期待通りに動作するはずです。 – ShankarSangoli

+2

'success'コールバックは' console.log'の後に実行されますか?これは、競合状態の結果としてのタイミングの問題である可能性があります。 –

+0

javascript(html5 Webワーカーを除く)はマルチスレッドではないため、実際の競合条件はありません – ori

答えて

3

success関数は、$ .couch.dbからの応答を受け取った後に呼び出されます。したがって、console.log(menu);に到達しても、まだ初期値が得られます。

+0

Ok。回答いただきありがとうございます。私はこれについて考えるべきだったと思います。私はajax呼び出しの中で変数を設定するかどうかにかかわらず、少し悪い習慣であると思います。助けてくれてありがとう!! – nologo

0

new Array()の代わりにvar menu = [];と宣言してください。差はありませんが、わかりません。

また、console.log(menu);をループの内側に入れてみてください。...ああ、待ってください。

上記を忘れて、コードをもう一度読んだだけです。

私は確かにallDocs()が非同期機能です。関数を開始した後、結果が完了する前に結果にアクセスしようとしています。 menuに依存するすべてのコードは、success機能になければなりません。

0

あなたの関数は非同期で動作することができます。コンソールの外にconsole.log(メニュー)があると、それはメニューの元の状態を示します。例えば

あなたは、AJAX機能を使用している場合は、jQueryの中であなたはに「非同期を」パラメータを設定することができますので、応答が正しく変数に割り当てられます。

0

問題は、データをコールバック内のメニュー配列にプッシュしていることです。これが意味することは、あなたのコードは次のように何らかの形で実行されるということです。

  • 新しい配列が作成され
    1. $ .couch.db()(実行フローが継続しますいくつかの非同期タスク、)何かをしていると呼ばれています通常メニュー以来、空の配列を出力しますと呼ばれる
    2. にconsole.log()は、それがビジネスだやって終わった()
    3. $ .couch.db空で、あなたの配列を埋め、あなたの「成功」コールバックを呼び出した

    しかし、あなたのコールバックがconsole.log()に達する前に実行される場合があります。本当にあなたはここで競合状態に対処しています。

  • 関連する問題