Подтвердить что ты не робот

Как определить, отложен ли объект jQuery?

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

4b9b3361

Ответ 1

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

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

С 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/

Ответ 2

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

"Когда я вижу птицу, которая ходит как утка и плавает, как утка и шарлатанья, как утка, я называю эту птицу утки". - Джеймс Уиткомб Райли

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

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

Вы можете подробно просмотреть эту проверку:

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

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

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

Ответ 3

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

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