2012-06-09 1 views
44

Если у меня есть функция, которая иногда возвращает отложенный объект, но иногда не отложенный объект. Как я могу сказать, какой из них он есть?Как определить, отложен ли объект jQuery?

+0

«Проверка типа» подразумевает другие аспекты :) –

+2

Как отложить? – alexn

+0

милый, имел такую ​​же проблему здесь –

ответ

48

В зависимости от вашего случая использования, вы можете также использовать jQuery.when [1]:

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

С jQuery.when вы можете обращаться со своим таинственным объектом всегда, как отложенный:

// x could be a deferred object or an immediate result 
var x = getMysteriousObject(); 
// success will be called when x is a deferred object and has been resolved 
// or when x is an immediate result 
jQuery.when(x).then(success, error); 

[1] http://api.jquery.com/jQuery.when/

+0

Очень полезный ответ, спасибо! – nrodic

+0

не будет ли ваш обработчик «успеха» иметь разные аргументы, переданные ему - в зависимости от того, был ли объект отложен или нет? В этом случае вам все равно придется использовать утиную печать, как показано ниже. – backdesk

+1

@Crungmungus: «Если один аргумент передан jQuery.when и он не является отсроченным или обещанием, он будет рассматриваться как разрешенный Deferred, и любые прикрепленные к нему завершенные транзакции будут выполнены немедленно. Прошедшим завершенным аргументам передается завершенный результат. " –

29

Поскольку jQuery Отложенные создаются путем копирования методов скрытого объекта вместо вызова нового оператора в функции, вы не можете доказать, что объект действительно является экземпляром jQuery.Deferred. Я думаю, что тебе понадобится, чтобы пойти с утиной типизации:

«Когда я вижу птицу, которая ходит как утка и плавает как утка и крякает как утка, я называю это птица утка.» - Джеймс Whitcomb Райли

В зависимости от того, какие объекты в противном случае могут быть возвращены (какие свойства следует ожидать), проверьте особые свойства/методы присутствуют:

var x = getMysteriousObject(); 
if (x.promise) { 
    // Deferred 
} else { 
    // Not a deferred 
} 

Вы можете подробно эту проверку, если требуется :

if ($.isFunction(x.promise)) { 
    // Deferred 
} 

или (различать будущие периоды объектов и другие реализации интерфейса Promise)

if (x.promise && x.resolve) { 
    // Deferred 
} 
+0

Хорошо, тогда я думаю, что утка-типизация - лучший способ пойти. Было волноваться о том, чтобы перепечь вместо утки. Теперь подумайте, что это не так важно. Большое спасибо! – WawaBrother

1

Вдохновленного Niko's answer, я создал еще одну реализации, которая будет проверять, если объект является отложенным основанный на имени его свойств , а также на содержание этих свойств. Я должен был это сделать, потому что у другого моего объекта было обещание.

if (typeof value.resolve !== "function") { 
    return false; 
} 
return String(value.resolve) === String($.Deferred().resolve);