Принимает ли jQuery.when нативные объекты Promise?

Можно ли передать собственный Promise объект в jQuery when и работает ли он должным образом?


person Chris W.    schedule 21.07.2018    source источник
comment
Возможный дубликат Могу ли я передать Promises в jQuery.when( ) или только отложенные?   -  person bigless    schedule 21.07.2018
comment
Если у вас есть встроенные промисы, мы рекомендуем вам использовать Promise.all(), так как его гораздо проще использовать.   -  person jfriend00    schedule 22.07.2018
comment
@jfriend00 интегрировали устаревшую кодовую базу, которая использует jquery deferreds / when с более новой кодовой базой ES6, поэтому нам нужно использовать обе.   -  person Chris W.    schedule 26.07.2018
comment
@bigless вопрос, безусловно, сформулирован как дубликат, но мне очень трудно разобрать ответ на этот вопрос. Есть много ссылок на обещания, и очень неясно, о какой версии Jquery они говорят и о каких обещаниях они говорят.   -  person Chris W.    schedule 26.07.2018


Ответы (2)


Да, это так. Первый параметр, переданный в then, — это промис, оттуда мы должны снова вызвать result.then(), чтобы получить результат промиса.

$.when(new Promise(resolve => {
  setTimeout(() => resolve('abc123'), 2000)
})).then(result => result.then(data => console.log(data)))
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

person Get Off My Lawn    schedule 21.07.2018

Да или нет в зависимости от используемой версии jQuery.

  1. jQuery ‹3 ... нет ... $.when() не будет разворачивать собственное обещание js. Он обрабатывает все, кроме своих собственных Deferred/Promises, так же, как и любой другой объект/значение.

// using jQuery 2.1.1
$.when(Promise.resolve('xxxyyy')).then(result => {
    console.log(result);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

  1. jQuery 3+ ... да ... в версии 3 jQuery был пересмотрен, чтобы быть (по крайней мере, в этом отношении) совместимым с обещанием /A+ спец. $.when() развернет любое обещание/затем, совместимое с Promise/A+, включая собственные обещания js.

// using jQuery 3.1.1
$.when(Promise.resolve('xxxyyy')).then(result => {
    console.log(result);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>

person Roamer-1888    schedule 25.07.2018