2016-08-19 6 views
3

я работал с Promises и предпочитают использовать его как это:Promise.defer стандарт?

function Deferred() { 
    this.resolve = null; 
    this.reject = null; 
    this.promise = new Promise(function(resolve, reject) { 
     this.resolve = resolve; 
     this.reject = reject; 
    }.bind(this)); 
    Object.freeze(this); 
} 

function somethingAsync() { 

    var deferred = new Deferred(); 

    // do stuff then deferred.resolve(); 

    return deferred.promise; 
} 

Я просто наткнулся, хотя в Firefox Promise.defer(), который дает мне то же самое, это стандарт? Или просто для Firefox? Я не могу найти его в документации Обещание Firefox даже - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise

+0

Вы уже видели [это] (https://developer.mozilla.org/en-US/docs/Mozilla/JavaScript_code_modules/Promise.jsm/Deferred) уже? – stevenelberger

+0

Спасибо @stevenelberger да, я видел это, но это редактирование викии пользователем. Я не верю, потому что 'Promise.defer' по-прежнему существует с Firefox 50. – Noitidart

+0

http://www.ecma-international.org/ecma-262/7.0/ ->' ctrl + f' "defer" – zerkms

ответ

5

Promise.defer было предложение в одном месте, но было принято решение не включать его в спецификации, но вместо этого включить конструктор обещание, которое использует the revealing constructor pattern.

Он был реализован в Firefox и Chrome, а затем удален из Chrome. Это не стандарт, а предложение в какой-то момент.

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

Причина комитет решил пойти с конструктором обещание потому, что он защищает от синхронных throw с по умолчанию:

new Promise((resolve, reject) => { 
    thisThrowsSynchronously(); 
}); 

Если бы конструктор обещание не сделал этого - вы бы потенциально .catch и } catch(e) { на каждое обещание возвращает вызов функции, который может расстраивать. Конструктор обещаний устанавливает инвариант, где достаточно .catch.

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

+0

Спасибо Бен за этот замечательный ответ. Однако jshint предупреждает о динамическом создании функций (в рамках функций во время выполнения). Является ли jshint неправильным? И это не плохо для производительности? – Noitidart

+1

Я бы использовал функцию стрелки над '.bind' - ваш код в целом хорош, но я, честно говоря, не понимаю, почему кто-то хотел бы использовать отсрочку очень :) –

+0

Как выглядит этот взгляд? Это так мило! 'function Deferred() {this.promise = new Promise ((... args) => [this.resolve, this.reject] = args); return Object.freeze (this)} ':). Лично у меня нет причин для отклонения в моем асинхронном потоке. Поэтому любые ошибки, которые возникают, мне нужно поймать во время разработки. Но это в сочетании с предупреждением jshint о «не динамически генерировать функции для производительности» привело меня к использованию отложенных в моих текущих проектах. – Noitidart

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