Есть ли способ создать отложенную оболочку объекта в jQuery?

Я много читал о новом объекте jQuery.Deferred. Одна вещь, которая была бы действительно полезной, — это возможность преобразовать существующий объект в отложенный, тогда вы получите 100% гибкость в отношении того, откуда вы получаете свои данные.

Я думаю что-то вроде

$.makeDeferred({property: "data"}) // returns an object with .promise() method, in resolved state, and that passes the original object as data/context to any callback function

Кто-нибудь знает, существует ли этот метод или как его создать?


person wheresrhys    schedule 13.04.2011    source источник
comment
см. мой ответ - $.when сделает это сам, потому что он проверяет, является ли каждый аргумент обещанием или нет, но вы не можете вызвать foo.done(), если foo не является обещанием.   -  person Alnitak    schedule 13.04.2011
comment
ах, да, теперь я понимаю, что вы имеете в виду. Да, вызов $.when(foo) действительно возвращает уже разрешенное обещание, когда foo является простым объектом.   -  person Alnitak    schedule 13.04.2011


Ответы (1)


Вам не нужно оборачивать объект, чтобы получить этот эффект, так как большинство методов, которым передаются обещания в качестве параметров, будут рассматривать простой объект как уже разрешенное обещание.

Тем не менее, если вы действительно этого хотите, попробуйте следующее:

(function($) {
    $.makeDeferred = function() {
        var d = $.Deferred();
        d.resolve(arguments);
        return d.promise();
    };
))(jQuery);

Это, по крайней мере, позволит вам также обработать случай, когда вы хотите вызвать метод of обещания, например my_promise.done(), в отличие от передачи обещания, т. е. $.when(my_promise).

[не проверено, может не работать, E&OE и т. д.]

ИЗМЕНИТЬ

На самом деле, я думаю, все, что вам нужно сделать, это обернуть свои обычные старые данные в $.when:

$.when({property: "data"})
person Alnitak    schedule 13.04.2011
comment
Ура - чувствую себя немного смущенным из-за отсутствия этого в документации. Хотя теперь мне хочется попытаться сломать его, используя when() для такого объекта, как {обещание: только шутка} - person wheresrhys; 13.04.2011
comment
да, способ проверки, является ли объект обещанием или нет, кажется немного хрупким... - person Alnitak; 13.04.2011