2016-06-24 24 views
0

で実行する必要があるあなたは、ページのテキストエリアでの.csv出力を作成するために必要なシナリオを持って言うことができます...のAjax APIの呼び出しは、順序

だから私は、私のループクエリの配列を持っています。ループ内でajax呼び出しにクエリを渡す...私はajax呼び出しの結果をテキストエリアに追加する必要があります。

私の質問は、あなたは彼らが要求されているために、プリントアウトした結果(クエリ配列の基本的順序)

//example array to loop. 
var queries= ['query1', 'query', 'query3', 'query4']; 

//the textarea where im going to print the results in order later to open in excel as a .csv file 
var $csvText= $('#some-text-area'); 

//inserting the csv headers 
$csvText.val('Column1, Column2\r\n'); 

$.each(queries, function(index, value){ 
    //someGoogleAPI is an ajax call from google's api 
    someGoogleAPI(value).then(function(response){ 
     //Adding row with values 
     $csvText.val(response.column1 + ',' response.column2 + '\r\n'); 
    }); 
}) 

を得るのです。これは簡単な例である方法ですが、これを解決することによって、私はアイデアを得るでしょう私の問題に取り組む方法の

ありがとうございます。代わりに$の

答えて

1

あなたのクエリがお互いに依存しないため、並列に実行することが可能と思われます。そうであれば、実際にはレスポンスを順番に処理するだけです。 、Promise.all()並行して、すべての要求

起動と並行して

を実行し、すべての結果を収集し、それらがすべて終了したら、知っているPromise.all()を使用して、挿入します。あなたはいくつかの方法があることを行うことができますすべての結果。

//example array to loop. 
var queries= ['query1', 'query', 'query3', 'query4']; 

//the textarea where im going to print the results in order later to open in excel as a .csv file 
var $csvText= $('#some-text-area'); 

//inserting the csv headers 
$csvText.val('Column1, Column2\r\n'); 

Promise.all(queries.map(function(item) { 
    return someGoogleAPI(value); 
})).then(function(results) { 
    $csvText.append(results.map(function(item) { 
     return response.column1 + ',' response.column2; 
    }).join('\r\n'));  
}); 

Promise.all()かかわらず、実際に最初の終了要求の、順に結果を収集します。

シーケンスあなたの操作

あなたはそう一つだけが一度に実行され、あなたの操作を順序付けることができ、それは結果だ挿入され、その後、次のいずれかがように実行しています。これは、エンドツーエンドの実行時間が遅くなりますが、結果を中間表示できます。

//example array to loop. 
var queries= ['query1', 'query', 'query3', 'query4']; 

//the textarea where im going to print the results in order later to open in excel as a .csv file 
var $csvText= $('#some-text-area'); 

//inserting the csv headers 
$csvText.val('Column1, Column2\r\n'); 

queries.reduce(function(p, item) { 
    return p.then(function() { 
     return someGoogleAPI(item).then(function(result) { 
      $csvText.append(result.column1 + ',' result.column2 + '\r\n'); 
     }); 
    }); 
}, Promise.resolve()); 

これは順序、それが到着したときにそれぞれがその結果を挿入次々に実行される連鎖約束のシリーズを作成します。私はそれがこのように動作するように取得することができます

+0

感謝:)だと思い、ちょうど今秒1をチェックアウトしてhttp://jsfiddle.net/Egli/pq3cj8nx/6/チェックあなたが作った最初の例を試してみましたが、その順序で実行されていません... –

+0

はちょうど彼らが...うーん順に –

+0

@EgliBecerraを実行してはいけない、再びhttp://jsfiddle.net/Egli/ordh2nLk/第二の例を試してみました - 彼らはあなたのjsFiddleで順番に実行するように彼らは私には見えます。あなたは何が順序どおりではないと思いますか? – jfriend00

1

は、あなたが約束の任意のリストを作成するために減らす使用することができます.each。

queries.reduce(function(seq, val) { 
    return seq.then(function() { 
     return someGoogleAPI(val) 
    }) 
    .then(function(response){ 
     var curr = $csvText.val(); 
     $csvText.val(curr + ',' + response.column1 + ',' + response.column2 + '\r\n'); 
     }); 
}, Promise.resolve()); 

jsfiddle:https://jsfiddle.net/75sse6n2/

+0

ニースアプローチ、結果出て、あなたのフィドルのプリントがランダムに時々...印刷物の順序が重要である...私はコードが好きとにかくヒープに感謝します。 –

+0

私はあなたがあまりにも良い申し訳ありません私の悪い –

関連する問題