Лучший способ получить выполненное обещание в jQuery?

При программировании с помощью обещаний в jQuery мне иногда нужно начинать с решенного обещания, особенно при связывании .then() в цикле, подобном этому, как показано в методе № 2 в этот ответ:

data.reduce(function(p, item) {
    return p.then(function() {
        return print(item);
    });
}, $.Deferred().resolve().promise());

Итак, я знаю, что могу получить решенное обещание с помощью этого:

$.Deferred().resolve().promise()

Но это кажется уродливым и расточительным (три вызова функций). Есть ли лучший (меньше кода, меньше вызовов функций) способ получить обработанное обещание в jQuery или лучший способ написать мой цикл .reduce() выше?


person jfriend00    schedule 03.08.2014    source источник


Ответы (1)


Для начала - вам не нужен .promise. Отложенные объекты jQuery уже тоже обещают, поэтому $.Deferred().resolve() также Работа.

На мой взгляд, это лучший подход к jQuery, поскольку он явный, однако есть более короткие способы обойти его. Самый короткий из известных мне:

$().promise(); // shorter but more hacky.

$.Deferred().resolve(); // this will work and is what I'd do

$.when(); // this is also a viable alternative 

Что достаточно коротко. Конечно, вероятно, лучше всего использовать лучшую библиотеку обещаний, когда это возможно, поскольку обещания jQuery не гарантируют хорошо упорядоченное асинхронное выполнение и не позволяют обрабатывать ошибки в дополнение к тому, что они очень медленные, если у вас выполняется много обещаний.

Конечно, никто не мешает вам написать вокруг него служебный метод :)

person Benjamin Gruenbaum    schedule 03.08.2014
comment
Хм. Клянусь, я посмотрел на один момент, и в jQuery Deferred не было .then() - было только обещание. Странно - не знаю, откуда у меня такое представление. Хотя, похоже, сейчас он работает как угощение. Хорошо, это сокращает один вызов функции. Я согласен, что мне не нравится $().promise(), потому что это кажется хакерским. - person jfriend00; 03.08.2014
comment
Отдельно отметим, действительно ли вам нужно отбрасывать обещания jQuery почти в каждом посте, в котором возникает эта тема? Я использую обещания, которые генерирует jQuery (например, из вызовов Ajax), поэтому мне не нужно импортировать еще одну библиотеку обещаний, которая не полностью совместима с обещаниями, создаваемыми jQuery (независимо от того, кто это виноват). - person jfriend00; 03.08.2014
comment
@ jfriend00 Мне очень жаль, если это звучит грубо, и я сам иногда использую обещания jQuery, но я искренне верю, что реализация обещаний jQuery абсолютно ужасна. Я видел, как разработчики падали в яму не один или два раза, и я предлагаю людям альтернативные реализации или собственные обещания, когда могу. Я видел кого-то, кого укусили обещания jQuery в примере, точно так же, как ваше сокращение на прошлой неделе, когда код после .reduce выполнялся до сокращения .then иногда из-за этого, и им потребовалось полчаса, чтобы найти. Я хотел бы предупредить людей, когда смогу. - person Benjamin Gruenbaum; 03.08.2014
comment
Я думаю, было бы более уместно, если бы вы сохранили свою рекомендацию о переходе на другую библиотеку обещаний и уничтожении реализации обещаний jQuery до тех пор, когда разница в реализации была особенно актуальной для конкретной обсуждаемой проблемы, а не только потому, что кто-то упомянул обещания jQuery в своих вопрос. - person jfriend00; 03.08.2014
comment
Ваши мысли были отмечены. Я их понимаю и уважаю. Я отвечаю на вопросы об обещаниях, чтобы продвигать эту технологию и помогать людям, которые с ней борются, мне было бы нелегко найти решение, не упомянув об этой распространенной ошибке. Особенно, когда я видел точно такой же сценарий только на прошлой неделе. Вы знаете об этом, но вы также, вероятно, знаете, что вы не единственный, кто читает этот ответ. Я не писал более 200 ответов об обещаниях только для того, чтобы продвигать людей, попадающих в эту яму. Спасибо за комментарий, хотя я буду иметь это в виду и буду более тонким. - person Benjamin Gruenbaum; 03.08.2014