2013-12-23 6 views
2

Я использую массив отложенных объектов. Этот массив имеет размер, поэтому он может иметь один или несколько отложенных объектов. Проблема возникает, когда обрабатывается вызов ajax. Код, как следующие:JQuery - массив обещаний и ответ формата

$.when.apply($, array_ajax_calls).then(...) 

При использовании .when с .Нанесите, если массив имеет только один объект обещание, то ответ является массивом с тремя объектами:

// Return the object, the status and the jqXHR object 
[Array[1] , "success", Object ] 

Если массив содержит более одного объекта, тогда он возвращает массив ответов, подобных предыдущему.

[ 
    [Array[1] , "success", Object ], 
    [Array[1] , "success", Object ], 
    ... 
] 

Как вы видите, ответ отличается. Первый возвращает массив с тремя значениями. Второй возвращает массив массивов, который содержит три значения. Это заставляет меня проверять, был ли вызов ajax выполнен для одного или нескольких объектов и изменить логику, поскольку ответ имеет другой формат.

Я не понимаю, почему я должен получить другой ответ. Если бы я прошел множество обещаний (даже если есть только один обещание) к .Не (...) функция Я бы ожидать, чтобы получить:

[ [Array[1] , "success", Object ] ] 

вместо

[Array[1] , "success", Object ] 

ли есть ли способ получить тот же формат ответа?

ответ

2

Поведение, которое вы упоминаете в своем вопросе, является конструктивным и связано с тем, что $.when() создает свое собственное обещание мастера, когда оно получает больше одного аргумента.

Несправедливые аргументы, однако, считаются разрешенными обещаниями, возвращающими эти аргументы. Таким образом, вы можете систематически проходить null как дополнительный аргумент $.when(), как, например:

$.when.apply($, [null].concat(array_ajax_calls)).then(...) 

Если вы сделаете это, то ответ на ваш then() обратного вызова всегда будет иметь вид:

[ 
    null, 
    [Array[1] , "success", Object], 
    ... 
] 

Оттуда вам нужно будет проигнорировать первый элемент и обработать все остальные.

+0

Если вы передаете массив, чтобы .when, как вы сказали в своем ответе, это будет рассматриваться как разрешенное обещание, и поэтому ответ будет массивом, который содержит неразрешенные обещания. – kitimenpolku

+1

@kitimenpolku, я не уверен, что понял ваш комментарий. Мы не передаем массив в '$ .when()', мы 'apply()' вводим массив в функцию, что приводит к тому, что элементы массива передаются как отдельные аргументы в '$ .when () '. –

+0

Вы правы, извините – kitimenpolku

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