Создать пустое обещание

У меня есть функция в цепочке обещаний, которая может что-то делать, а может и не делать. Например.

  getYear().then(function(results){
    if(results.is1999) return party();
    else return Q.fcall(function(){/*do nothing here*/});
  }).then(sleep)

Где getYear, party и sleep возвращают обещания. Есть ли более краткий способ написать оператор else? То есть ничего не делать, но все же вернуть цепочку обещаний?


person prauchfuss    schedule 24.05.2013    source источник
comment
Спасибо @Beetroot-Beetroot. Исправлено.   -  person prauchfuss    schedule 25.05.2013
comment
Я предположил, что партия была просто значением обещания, а не функцией, которая вернула обещание. Я также предполагал, что это не имеет значения в любом случае, поскольку это был просто код для демонстрации примера. Теперь я вынужден предположить, что вы действительно создаете программу, которая устраивает вечеринку, но только если это 1999 год.   -  person ForbesLindesay    schedule 29.05.2013
comment
О да, это производственный код и совершенно серьезно. Кстати, спасибо за очень обстоятельный ответ.   -  person prauchfuss    schedule 30.05.2013


Ответы (1)


Да. Q(value) возвращает промис для value (он также разворачивает значение, если value является промисом).

  getYear().then(function(results){
    if(results.is1999) return party();
    else return Q(undefined);
  }).then(sleep)

В качестве альтернативы вы можете получить точно такую ​​же семантику, просто ничего не возвращая:

  getYear().then(function(results){
    if(results.is1999) return party();
  }).then(sleep)

Если то, что вы хотели, было обещанием, которое никогда не было решено, вашим лучшим выбором было бы

  getYear().then(function(results){
    if(results.is1999) return party();
    else return Q.promise(function () {});
  }).then(sleep)

Что вы можете сделать, так это повторно использовать одно и то же обещание:

  var stop = Q.promise(function () {});
  getYear().then(function(results){
    if(results.is1999) return party();
    else return stop
  }).then(sleep)
person ForbesLindesay    schedule 25.05.2013
comment
Что вы имеете в виду под обещанием, которое никогда не было выполнено? Есть ли в этом какое-то преимущество перед промисом, возвращающим значение (скажем, results)? - person Patrick M; 15.04.2014
comment
@Patrick Promises может находиться в одном из трех состояний: «Ожидание», «Выполнено» и «Отклонено». Обещание может оставаться в состоянии ожидания навсегда. Вот что я имею в виду под обещанием, которое никогда не выполняется. Я бы сказал, что в целом это анти-шаблон, но он может быть полезен, если вы хотите предотвратить выполнение всей логики после выполнения данной функции. По сути, это позволяет вам пропустить все обработчики успеха и все обработчики ошибок дальше по цепочке. Хотя, наверное, лучше этого избегать. - person ForbesLindesay; 20.04.2014
comment
Да, это кажется плохой идеей. Что в этом примере приводит к тому, что обещание никогда не выполняется? Потому что последний .then(sleep) возвращает обещание, которое никогда ни к чему не присваивается? (И, следовательно, не может быть .then'ed или .done'ed?) - person Patrick M; 20.04.2014