2013-05-24 6 views
17

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

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

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

+0

'return party' или' return party() '? –

+0

Спасибо @ Beetroot-Beetroot. Исправлена. – prauchfuss

+0

Я предположил, что партия была просто обещанием, а не функцией, которая вернула обещание. Я также предположил, что это не имеет значения, так как это был всего лишь код для демонстрации примера. Теперь я вынужден предположить, что вы действительно создаете программу, которая бросает вечеринку, но только если это 1999. – ForbesLindesay

ответ

26

Да. 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) 
+0

Что вы подразумеваете под «обещанием, которое никогда не разрешалось»? Есть ли какое-то преимущество для этого, если у вас есть обещание, которое возвращает значение (скажем, «результаты»)? –

+0

@Patrick Обещания могут быть в одном из трех состояний: Ожидание, Выполнено и Отклонено. Вы можете иметь обещание оставаться в состоянии «Ожидание» навсегда. Это то, что я имею в виду под «обещанием, которое никогда не разрешается». Я бы сказал, что в целом это анти-шаблон, но может быть полезно, если вы хотите предотвратить всю логику после выполнения какой-либо функции. Это позволяет вам, по сути, пропустить все обработчики успеха и все обработчики отказа дальше по цепочке. Скорее всего, этого лучше всего избежать. – ForbesLindesay

+0

Да, это похоже на плохую идею. Что в этом примере заставляет обещание никогда не выполняться? Потому что окончательный '.then (sleep)' возвращает обещание, которое никогда не привязано ни к чему? (И таким образом не может быть '. Then''ed или' .done''ed?) –

 Смежные вопросы

  • Нет связанных вопросов^_^