2017-07-22 16 views
0
for(var j = 0; j < tempArray.length; j ++){ 
$.getJSON('http://localhost:8080/predict', tempArray[j]) 
    .fail(function(data,textStatus, error) { 
     Probability = data.responseText; 
     console.error("getJSON failed, status: " + textStatus + ", error: "+error); 
    }) 

    .done(function(data) { 
     console.log(data); 
     Probability = data.classProbabilities[0]; 
     Array.prototype.push.call(resultPercentage, Probability); 
    }); 
} 
console.log(resultPercentage); 

tempArrayは10個のオブジェクトの配列です。 forループを使ってjsonに配列を渡しています。
resultPercentageは、10の異なる結果を1つのアレイに印刷しています。
Json for forループを呼び出すたびに、その配列の結果のシーケンスを変更し続けます。forループを使用してjsonを複数回呼び出す際に問題が発生しました

+0

問題は何かを明確にすることができますか?あなたは10の期待される結果があるので、あなたは '.get()'が非同期だと知っていますよね? –

+0

@LouysPatriceBessette:はい、どうすれば結果を同期させることができますか? "resultPercentage"を返すたびに、ランダムシーケンスの配列が返されます。 – DRules

+0

これは、ほぼ同時にサーバーに送信された複数のajaxリクエストを「並べ替える」ことはできないと思います。治療の順序はサーバーによって異なります。あなたは何をすべきでしょうか?データと一緒に "識別子"を送り、この識別子を応答と共に返すように管理します。それを使ってそれらを「並べ替える」。 - Like ...代わりにオブジェクトを送信する: '{data:tempArray [j]、id:j}' –

答えて

0

私は同様の問題を持っていたし、私はこのようなものでした:あなたはまた、forループを使用して、これを試すことができます

$.each(array, function(key, value) { 
     $.ajax({ 
     url: "http://localhost:8080/example", 
     data: JSON.stringify(value), 
     async:false, 
     success:something, 
     fail:something 
     }); 
    }); 

を。async:falseを指定すると、非同期で実行されなくなります。

+0

これは有望そうです。私が試してみましょう ! – DRules

+0

Worked!ありがとう:) – DRules

0

このようなことをします。注意:ループ内で関数を実行することはできません。試してみてください。もしそうでなければ、あなたが実際にやりたいことをあなたの意図を提供してください。

var tempArray = []; 

for(var j = 0; j < tempArray.length; j++){ 
        $.getJSON('http://localhost:8080/predict', tempArray[j]) 
        .fail(first) 
        .done(second); 
    } 
    console.log(resultPercentage); 

function first(data, textStatus, error) { 
         Probability = data.responseText; 
         console.error("getJSON failed, status: " + textStatus + ", error: "+error); 
        } 

function second(data) { 
        console.log(data); 
        Probability = data.classProbabilities[0]; 
        Array.prototype.push.call(resultPercentage, Probability); 
       } 
+0

私のプログラムでは、resultPercentageの出力は{15,88,30,55,7}の配列です。プログラムをもう一度実行すると{30,55,7,15,88}になります。シーケンスは変化し続けます。 私はtempArray [0]は最初の位置で、tempArray [1]は出力配列の2番目の位置で答えを返すようにします。 – DRules

0

などはコメントで、複数のAjaxのresquestの処理順序が同時にをほとんど(私たちが話しているマイクロ秒)を送信し、サーバーに依存しました。

サーバーでの管理方法はわかりません。
の場合はとなりますが、保証はされていません。

私はhttp://localhost:8080/predictが何をするか分からないので、私は唯一のtheorical提案...
に答えることができます。
これがPHPかどうかわかりません。



         だから、これは私だけが適用しようとするだろう原則です...
         私は試したことがない...ところで。 ;)
最初に行うことは、idという要求としてjループカウンタを渡すことです。
次に、ループ内で.fail().done()の代わりにAjax Global Eventsを使用して応答を処理します。 、http://localhost:8080/predictで、データを取得し、自分のものを行う今

for(var j = 0; j < tempArray.length; j ++){ 
$.getJSON('http://localhost:8080/predict', '{data:tempArray[j],id:j}'); // Pass the array AND an id 
} 


これは、これにforループを短くします。
idにjsonレスポンスで再注入するようにしてください。

<?php 
$data = $_REQUEST['data']; 
$id = $_REQUEST['id']; 

// Do your stuff with $data... 
// ... 

// Add the passed id to the json actually produced: 
echo '{id:' . $id . ', classProbabilities:[0.90], color:"blue", somethingElse:"Other data"}'; 

?> 

Ajaxグローバルイベントを使用すると、いくつかのカウンターを使用できます。
結果を表示する前に、すべての要求が完了していることを確認すると便利です。
一部のリクエストが失敗した場合でも、成功したリクエストの結果を表示できます。

// Counters. 
var completed_Ajax = 0; 
var error_Ajax = 0; 
var success_Ajax = 0; 

// An array to get the resquest response order 
var responseOrder = []; 

// An array to have the resquest responses reordered (final result) 
var resultPercentageOrdered = []; 


// Error handler 
$.ajaxError(function(request, status, error){ 
    error_Ajax++; 
    console.log("Error #"+error_Ajax+":\n"+error); 
}); 

// Sucess handler 
$.ajaxSuccess(function(data){ 
    success_Ajax++; 

    // Handle the data (your code untouched) 
    console.log(data); 
    Probability = data.classProbabilities[0]; 
    Array.prototype.push.call(resultPercentage, Probability); 

    // Push the received id in array. 
    responseOrder.push(data.id); 

    if(success_Ajax == tempArray.length){ 
    console.log("All resquests succeded."); 
    } 
}); 

// Completed request handler 
$.ajaxComplete(function(){ 
    completed_Ajax++; 

    if(completed_Ajax == tempArray.length){ 
    console.log("All resquests done."); 
    } 

    if((error_Ajax + success_Ajax) == tempArray.length){ // Even if there are errors... Show results when all resquests completed. 

    // The result before ordering. 
    console.log(JSON.stringify(resultPercentage)); 

    // Just for fun, show the resquest processing order 
    console.log(JSON.stringify(responseOrder)); 

    // Reordering the results, using responseOrder 
    // 
    for(i=0;i<success_Ajax;i++){ 
     var index = responseOrder.indexOf(i); 
     resultPercentageOrdered.push(resultPercentage[index]); 
    } 

    // Show them in console. 
    console.log(JSON.stringify(resultPercentageOrdered)); 

    // Use this result array here. 
    // ... 
    // ... 
    } 
}); 
+1

このソリューションをありがとう。私はこれを使って試してみましょう、私はあなたにすぐに知らせるでしょう:) – DRules

関連する問題