Когда следует использовать Q.defer, а когда просто Promise.resolve/reject?

Я использую nodejs и задаюсь вопросом, когда мне следует использовать Q отсрочку, а когда просто использовать Promise.resolve/ отклонять?

Я видел много примеров обоих видов, например:

// with Q defer
fucntion oneWay(myVal) {
  var deffered = Q.defer();
  if (myVal < 0) {
    deffered.reject(new Error('nope'));
  } else {
    deffered.resolve('yay');
  }
  return deffered.promise;
}

// native Promise
fucntion orAnother(myVal) {
  if (myVal < 0) {
    return Promise.reject(new Error('nope'));
  } else {
    return Promise.resolve('yay');
  }
}

В чем разница и когда лучше использовать разницу?

Есть ли разница между Promise.resolve/reject (собственным) и Q.resolve/reject? Они оба возвращают обещание, но оно выглядит по-другому, когда я смотрю на возвращаемое значение в консоли узла.

Спасибо


person arieljannai    schedule 10.02.2016    source источник
comment
Непонятен контекст (интерфейс FW как Angular, приложение узла и т. д.) и что вы имеете в виду с Promise (собственные обещания ES6, библиотека, такая как Bluebird?)   -  person Alessandro Loziobiz Bisi    schedule 10.02.2016
comment
ты прав. Я сделал это более понятным (узел и нативное обещание)   -  person arieljannai    schedule 10.02.2016
comment
Это более или менее альтернативная реализация одной и той же идеи. Используйте то, что вы предпочитаете.   -  person deceze♦    schedule 10.02.2016
comment
Если у вас есть доступ к собственным обещаниям, я предлагаю вам использовать его и не импортировать внешнюю библиотеку, чтобы просто делать то, что вы можете сделать без нее. Если вам нужны дополнительные обещания, взгляните на Bluebird или Когда библиотеки   -  person Alessandro Loziobiz Bisi    schedule 10.02.2016


Ответы (1)


Нет причин использовать Promise конструктор или - хуже - отложенный, когда вам это не нужно. В ваших функциях нет ничего асинхронного, поэтому вам не нужны (и не должны использоваться) обратные вызовы.

Просто выберите Promise.resolve/Promise.reject или их аналоги Q и создайте обещание значения напрямую. В любом случае это намного короче и проще.

См. также конструктор промисов с отклонением вызова и ошибкой выдачи.

Когда рекомендуется использовать отсрочку?

Никогда. Даже в Q следует использовать Q.Promise.

Есть ли разница между Promise (нативным) и Q? Они выглядят по-разному, когда я смотрю на возвращаемое значение в консоли узла.

Ну, это разные классы с разными свойствами, и Q обещания имеют больше методов.
Однако они работают одинаково и полностью совместимы друг с другом.

person Bergi    schedule 10.02.2016
comment
так что никогда не нужно откладывать? (тоже в асинхронных функциях?) - person arieljannai; 10.02.2016
comment
Да, defer полностью устарел в конструкторе промисов. - person Bergi; 10.02.2016
comment
большое спасибо! это действительно сбивало с толку, потому что даже в документации Q показано использование отсрочки - person arieljannai; 10.02.2016