Если у меня есть функция, которая иногда возвращает отложенный объект, но иногда не отложенный объект. Как я могу сказать, какой из них он есть?Как определить, отложен ли объект jQuery?
ответ
В зависимости от вашего случая использования, вы можете также использовать 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);
Очень полезный ответ, спасибо! – nrodic
не будет ли ваш обработчик «успеха» иметь разные аргументы, переданные ему - в зависимости от того, был ли объект отложен или нет? В этом случае вам все равно придется использовать утиную печать, как показано ниже. – backdesk
@Crungmungus: «Если один аргумент передан jQuery.when и он не является отсроченным или обещанием, он будет рассматриваться как разрешенный Deferred, и любые прикрепленные к нему завершенные транзакции будут выполнены немедленно. Прошедшим завершенным аргументам передается завершенный результат. " –
Поскольку 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
}
Хорошо, тогда я думаю, что утка-типизация - лучший способ пойти. Было волноваться о том, чтобы перепечь вместо утки. Теперь подумайте, что это не так важно. Большое спасибо! – WawaBrother
Вдохновленного Niko's answer, я создал еще одну реализации, которая будет проверять, если объект является отложенным основанный на имени его свойств , а также на содержание этих свойств. Я должен был это сделать, потому что у другого моего объекта было обещание.
if (typeof value.resolve !== "function") {
return false;
}
return String(value.resolve) === String($.Deferred().resolve);
«Проверка типа» подразумевает другие аспекты :) –
Как отложить? – alexn
милый, имел такую же проблему здесь –