3

documentation для jQuery.when() говорит, что эта функция принимает Отсрочки. Тем не менее, он также говорит о том, что позже:Могу ли я передать обещания jQuery.when() или только отложить?

Если один аргумент передается jQuery.when(), и это не Отложенный или Promise ...

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

Вопросы:

  1. Может $ .when() принимает либо посылы или Deferreds? Кажется, это работает в моем тестировании.
  2. Есть ли ошибка в документе? Я думаю, он должен сказать, что $ .when() берет Обещания, а не только Отсрочки.
+0

1. Да, это возможно. 2. Возможно, он лучше подходит для разработчиков jQuery. –

+0

@ Karl-AndréGagnon 2. Хорошая идея - я зарегистрировал эту ошибку документации jquery: https://github.com/jquery/api.jquery.com/issues/906 –

+0

@JonathanAquino '$ .when()' может принимать ' jQuery.Deferred() ',' jQuery.promise() 'или собственный' Promise'. См. Http://blog.jquery.com/2016/01/14/jquery-3-0-beta-released/. Документация в '$ .when()' пытается описать, что '$ .when()' может принимать параметр, который является префиксом 'jQuery.Deferred()', 'jQuery', или собственный' Promise', и обратные вызовы '.then()' или '.done()' будут обрабатывать переданный параметр как решение 'jQuery.Deferred()' – guest271314

ответ

2

Что документация пытается передать то, что $.when() будет принимать значение, которое не является ни jQuery.Deferred(), jQuery.promise() ни Promise; значение будет рассматриваться как разрешенный jQuery.Deferred(), который описан в следующей части предложений

Если один аргумент передается jQuery.when() и это не будущими периодами или обещание, это будет рассматриваться как разрешенные Отложенные и любые прикрепленные файлы doneCallbacks будут выполнены немедленно.

Например

$.when(1).then(function(data) { 
 
    alert(data) 
 
})
<script src="https://code.jquery.com/jquery-git.js"> 
 
</script>

+0

Я прошу, если $ .when может принять обещание объекты. Док говорит, что принимает только Отсрочки. Но в моем тестировании он принимает обетоподобные объекты (т. Е. Deferred.promise()). –

+0

@JonathanAquino _ «Док говорит, что он принимает только отсрочки». _ Где в документации это указано? '$ .when()' принимает любую переменную или объект в качестве параметра; не только 'jQuery.Deferred()'. Что вы подразумеваете под «обетоподобными объектами»? Чего вы пытаетесь достичь с помощью '$ .when()'? – guest271314

+0

@JonathanAquino _ "Если один аргумент передан jQuery.when(), и он не является отсрочкой или обещанием, он будет рассматриваться как разрешенный Deferred, и любые прикрепленные к нему завершенные транзакции будут выполнены немедленно." _ ['JQuery. когда() 'documentation] (https://api.jquery.com/jquery.when/) – guest271314

2

Я думаю, вы могли бы сказать, что Отложенный это обещание, но обещание не Отложенный.

На самом деле это совершенно разные интерфейсы, только jQuery смешивается в API обещаний с их отсрочкой. См. What are the differences between Deferred, Promise and Future in JavaScript?

Может ли $.when() выполнить обещания или отложить?

Да, это может быть и то, и другое. Но обратите внимание, что, когда вы уже знаете, что имеете обещание или отложенный, нет смысла звонить на него $.when.

Есть ли ошибка в документе?

Да, очевидно. И это даже не правда, что он рассматривает только отсрочки и обещания как асинхронные ценности - скорее, это делает какую-то проверку на утиную печать.Вы хотите, чтобы взглянуть на actual implementation:

if (resolveValues[ i ] && jQuery.isFunction(resolveValues[ i ].promise)) 

Затем он вызывает promise method (или another promise method, или действительно любой .promise метод) на значение и ожидает, что возвращаемый объект, чтобы иметь соответствующие змеевидных методы для добавления слушатели.

+0

Эта часть Документация, по-видимому, фактически описывает '$ .when()' принятие любого параметра - не только 'jQuery.Deferred()' jQuery '.promise()' object или native 'Promise', и обработку этого параметра как разрешенного' jQuery. Deferred() '. OP опущен остаток предложения при цитировании в оригинальном Вопросе, таким образом, возможная путаница в отношении цитаты с документацией и того, что она пытается передать, и текущего Вопроса. OP может пытаться спросить, в чем разница между' jQuery.Deferred () 'и jQuery' .promise() 'object - и, возможно,' Promise', хотя это неясно в вопросе. – guest271314

+0

@ guest271314: Конечно, он считает, что всем ясно, что любые значения, не идентифицированные как «обещающие», будут рассматриваться непосредственно как значения выполнения , Мой ответ только уточняет, что «обещает», а что нет. – Bergi

+0

Не могли бы вы расшириться на _ «Но обратите внимание, что, когда вы уже знаете, что имеете обещание или отложенный, нет смысла называть' $ .when' на нем. _ _? Я все еще неясен в Promise и Deferred, и я думаю, что небольшое объяснение, почему (нет смысла), помогло бы мне и будущим посетителям. –