2015-04-28 4 views
1

Я действительно стараюсь понять поведение или обещание JQuery().Смутно о обещаниях JQuery

Я хочу сделать 3 (несвязанный, но спина к спине) AJAX запросы:

1. GET the user data 
2. POST an image 
3. POST another image 

Затем я делаю нагрузки вещей, которые рассчитываемую на основе результатов указанных запросов.

Теперь $ .when (Ajax, AJAX, AJAX) .then (USERDATA, img1, img2) функции работают отлично подходит для этого как сейчас, но что, если я хочу, чтобы мой Ajax звонки быть обернуты вокруг условий , а так:

$.when(
if(...){ 
    $.ajax({ ...GET user data... }); 
} 
if(...){ 
    $.ajax({ ...POST image... }); 
} 
if(...){ 
    $.ajax({ ...POST image... }); 
} 
).then(function(userData, img1, img2){ 
if(img1){ 
    ...do something with img1... 
} 
...same for other responses... 
}); 

Я знаю, что мой код не содержит никаких обещаний, но на самом деле, все, что я пытался не удалось довольно плохо в этом сценарии.

Любые подсказки/подсказки. Благодарю.

+0

Как обернуть функции ajax в другие функции, где вы можете использовать свои условия, например: '$ .when (function ajaxForSomeCondition() {if (someCondition) {return $ .ajax ...}})' – Bwaxxlo

+0

также см. [ если с асинхронным случаем] (http://stackoverflow.com/a/29802688/1048572), [переписать ряд условных операторов] (http://stackoverflow.com/a/21913675/1048572) или [обещает и если/else] (http://stackoverflow.com/q/21911369/1048572) – Bergi

ответ

1

Я думаю, что вы ищете тройной оператор, и способ построения обещания Значения по умолчанию:

$.when(
    … ? $.ajax({/* GET user data */}) : $.when(null), 
    … ? $.ajax({/* POST first image */}) : $.when(null), 
    … ? $.ajax({/* POST second image */}) : $.when(null) 
).then(function(userData, img1, img2){ 
    if (userData) 
    … // do something with userData 
    if (img1) 
    … // do something with img1 
    … 
}); 

Это будет, на основании соответствующего условия, либо отправить запрос AJAX и получить обещание для его результат или построить уже выполненное обещание для значения null. Затем ожидаются все три обещания.

+0

Это разрешило это. Спасибо огромное! – Justin01

+0

(связанный: http://stackoverflow.com/questions/26599798/if-else-flow-in-promise-bluebird) – Bergi

3

Вы можете передать не-обещания JQuery-х $.when он будет иметь дело их просто отлично:

$.when(15, undefined, $.ajax(...)).then(function(fifteen, undef, result){ 
    // this will run when the result is ready 
}); 

Если вы хотите сделать что-то на основе результата звонков вы можете приковывают их через .then, если вы хотите запускать их один за другим, вы можете использовать последующую цепочку вместо $.when, которая работает одновременно.

Смежные вопросы