2016-12-16 33 views
0

皆さん私は約束を使ってループ内でajaxを使用しようとしていますが、ループ内で2回目のajax呼び出しはajaxリクエストではありません。約束を使用してループ内でajaxを呼び出す

これは私のコードです:

var general = []; 
    var all_info =[]; 
    var usuario =[]; 
    var resultPromise = getProjects(); // Promise for a response. 
    resultPromise.then(function(all_projects) { 
    return $.when.apply($, all_projects.map(function (current_project, index){ 
     var items = {}; 
     items.name = current_project.key; 
     items.children = [{"total_cpu": current_project.cpuhour_tot, "num_jobs" : current_project.num_jobs }]; 
     return addUsers(current_project.key) 
     .then(function(item_user) { 
     info_user = {}; 
     info_user.name = item_user.key; 
     info_user.children = [{"total_cpu" : item_user.cpuhour_tot, "num_jobs": item_user.num_jobs }]; 
     all_info.push(info_user); 
     }); 
     items.children.push(all_info); 
     general.push(items) 
    })); 
    }) 
    .then(function() { 
    console.log("complete", general); 
    }) 
    .fail(function(jqxhr, textStatus, errorThrown) { 
    console.log(errorThrown); 
    }) 

私はこのラインreturn addUsers...から戻ったとき、私は項目にall_info値を含める必要があり、all_projectsに他のループを実行する前に、私は

general.push(items)

ことをしなければなりません itemsにアクセスすることはできません。

私には何が欠けていますか?

ありがとうございます!

+0

foreachの代わりにwhileループを実行し、約束が行われた後にカウンタをインクリメントします。それを得る ? –

+0

http://stackoverflow.com/questions/18424712/how-to-loop-through-ajax-requests-inside-a-jquery-when-then-statment – bassxzero

+0

なぜあなたは '.forEach()'内で同じ識別子を使用しますか? 'var resultPromise = addUsers(current_project.key);'? – guest271314

答えて

1

.forEach()$.when(),Function.prototype.apply()usuarioは配列です。アレイへの.push()value

resultPromise.then(function(all_projects) { 
    return $.when.apply($, all_projects.map(function (current_project, index){ 
    var items = {}; 
    items.name = current_project.key; 
    items.children = [{"total_cpu": current_project.cpuhour_tot, "num_jobs" : current_project.num_jobs }]; 
    return addUsers(current_project.key) 
    .then(function(value) { 
     console.log(value) 
     usuario.push(value); 
     // use value here before continues; 
     // do stuff with `value` or `usuario` here 
    }); 
    })); 
}) 
.then(function() { 
    console.log("complete", usuario) 
}) 
.fail(function(jqxhr, textStatus, errorThrown) { 
    console.log(errorThrown) 
}) 
+0

こんにちは@ guest271314あなたのコードを使用していただきありがとうございますが、このリターンを終了した後、この値をアイテムに使用する必要がありますが、アイテム 'items.children.push(all_info);を変更する方法が見つかりません。 – Stone

+1

'items.children.push(all_info); general.push(items)'は 'addUsers()'に連鎖した '.then()'関数の中になければなりません。 'items'は' .map()内のローカル変数なので 'items'はpromise chainの外では定義されませんが、' items'を 'general'配列に' .push() 'しても可能です。 '.then()'の要素にアクセスして 'resultPromise'に連鎖します。例えば、 'usuario.push(value); items.children.push(all_info); general.push(items)'、 'console.log(" complete "、usuario、general)' – guest271314

0

のjavascriptの非同期シングルスレッド性質について読むと、あなたはここで何が起こるかを理解するのに役立ちます。

基本的に次の命令:

resultPromise.then(function(value) { 
    usuario = value; 
    // use value here before continues; 
    console.log("first"); 
}); 

は「約束が解決され、実行スタックがクリアされると、将来のある時点でコールバック関数を実行」を求めています。コールバック関数は実行されず、現在の実行スレッドが完了するまで実際には実行されません。

関連する問題