2016-12-19 7 views
1

サブプロセスで配列を処理する関数があります。javascript関数からの戻り配列が機能しません

実際の配列を関数に送り、更新された配列を返すことです(2つの値が削除されます)。

私がして、関数を呼び出しています:呼び出された関数がありません

var resultMaster = []; 
resultMaster = traceSystem(traceURL,searchURL,term,master_id,groupID,final_pair,masters); 
    console.log('resultMaster: ' + resultMaster); 
    console.log('resultSystem under Master: ' + masters); 

function traceSystem(traceURL,searchURL,term,master_id,groupID,pairKey,masters) { 
    var resultSystem = []; 
    ... 
    $.ajax({ 
    url: searchURL, 
    type:'post', 
    data: jsonQuery, 
    dataType: 'text', 
    crossDomain: true, 
    async: false, 
    success: function(response) { 
     ... 
     for (m = 0; m < system.masters_ids.buckets.length; m++) { 
      console.log('Removing masterID: ' + system.masters_ids.buckets[m].key); 
      masters = masters.filter(function(e) { return e != system.masters_ids.buckets[m].key }); 
      console.log('resultSystem: ' + masters); 
     }; 

    } // Success 
    }); //Ajax 

    console.log('final result from System: ' + masters); 
    return masters; 
}; 

私はreturn masters;が変数resultMasterに親関数に配列を返すことを想定。しかし、それはしません。

コンソールからログインを参照してください:ループから

Array [ "[email protected]…", "[email protected]…", "3b3_87465652", "00000553239291", "[email protected]…", "[email protected]…" ] 

ログ:右ループの後

Removing masterID: 3b3_87465652 
resultSystem: [email protected]_te,[email protected]_te,00000553239291,[email protected]_te,[email protected]_te 

Removing masterID: [email protected]_te 
resultSystem: [email protected]_te,00000553239291,[email protected]_te,[email protected]_te 

ログイン:

final result from System: [email protected]_te,00000553239291,[email protected]_te,[email protected]_teindex-by-masterid.jsp:343:5 

ログ親関数からtraceSystemから後の戻り値:

resultMaster:  
resultSystem under Master: [email protected]_te,[email protected]_te,3b3_87465652,00000553239291,[email protected]_te,[email protected]_te 

変数resultMastersが空であるようです。

呼び出された関数から配列を正しく返すにはどうすればいいですか?

@Quentin要求に基づいて追加:私は行動と奇妙をシミュレートするために別の簡単な例を作成しようとしました

は作業があることがある:

<script type="text/javascript"> 
      function traceMasterId(masters) { 
       var resultMaster = [], 
       masters = []; 

       masters.push('[email protected]_te'); 
       masters.push('[email protected]_te'); 
       masters.push('[email protected]_te'); 
       masters.push('[email protected]_te'); 
       masters.push('3b3_87465652'); 
       masters.push('00000553239291'); 

       console.log('Masters: ' + masters); 

       resultMaster = traceSystem(masters); 

       console.log('resultMaster: ' + resultMaster); 
      }; 

      function traceSystem(masters) { 
       var master_ids = []; 

       master_ids.push('[email protected]_te'); 
       master_ids.push('3b3_87465652'); 

       for (m = 0; m < master_ids.length; m++) { 
        console.log('Removing masterID: ' + master_ids[m]); 
        masters = masters.filter(function(e) { return e != master_ids[m] }); 
        console.log('resultSystem: ' + masters); 
       }; 

       console.log('Final result from System: ' + masters); 
       return masters;    

      }; 

</script>     

<body onload="traceMasterId();"></body> 

ログを参照してください:

Masters: [email protected]_te,[email protected]_te,[email protected]_te,[email protected]_te,3b3_87465652,00000553239291test.jsp:14:5 
Removing masterID: [email protected]_tetest.jsp:29:6 
resultSystem: [email protected]_te,[email protected]_te,[email protected]_te,3b3_87465652,00000553239291test.jsp:31:6 
Removing masterID: 3b3_87465652test.jsp:29:6 
resultSystem: [email protected]_te,[email protected]_te,[email protected]_te,00000553239291test.jsp:31:6 
Final result from System: [email protected]_te,[email protected]_te,[email protected]_te,00000553239291test.jsp:34:5 
resultMaster: [email protected]_te,[email protected]_te,[email protected]_te,00000553239291test.jsp:18:5 

私は他の方法で何が行われたのか違いはありません。サブ関数が1つのパラメータでのみ呼び出されたことを除けば、

+1

コードは '非同期言う:偽、' - それはにISN非同期呼び出し。 – Quentin

+0

これは意味をなさない。あなたは値を記録します。その値を返します。戻り値を記録します。そして彼らは異なっています。私は下で起こるどんな状況も考えることができません。あなたはあなたの[mcve]をもっと* minimal *と* complete *にすることができますか? – Quentin

+1

'async:false'が[仕様で廃止されました](https://xhr.spec.whatwg.org/#sync-warning)であることに注意してください。ブラウザはいつでもエラーをスローすることができますあなたのコード。 –

答えて

0

$ .ajax()は非同期関数であるため、できないはずです。

あなたの成功コールバックが実際に呼び出される前に、traceSystem()関数がを返す前に、が返されます。

mastersオブジェクトは実際に変更される前に返されます。

deasync(nodejsモジュール)がブラウザで使用されていた可能性がありますが、あなたのベスト・ベットは非同期に行うようにコードを書き直すことです。

例えば、次のとおりです。

  1. traceSystem()機能にコールバック引数を追加します。

  2. $アヤックス()成功コールバックの終わりに(引数としてマスターを渡して)それを呼び出します。

  3. の代わりに...

この:

[...] 
resultMaster = traceSystem(arg1, arg2...); 
console.log('resultMaster: ' + resultMaster); 
[...] 

...試してみてください。

[...] 
traceSystem(arg1, arg2... , function(resultMaster){ 
    console.log('resultMaster: ' + resultMaster); 
    [...] 
}); 
0

報告された問題は問題ではないようです。

コード内の行を再フォーマットしただけで動作し始めました。

おそらく隠しキャラクタが実際の戻り値をエスケープしました。

+0

私はそうは思わない:これは、(警告( "Foo bar");を実行するのと同じように)遅延の副作用であるはずです。関数を呼び出して、終了するAjax処理の時間を与えます。他のブラウザやランダムな状況では... – bitifet

関連する問題