Нативный Promise() для JavaScript без обратного вызова

Посмотрите на этот код jQuery:

var promise = new Deferred(),
    some;

some = function(promise) {
    // do cool things

    promise.resolve();
};

promise.then(/*  callback cool things   */);

// init everything
some(promise);

Я не уверен в архитектурной правильности такого подхода, но я им давно пользуюсь и мне он удобен.

В нативном JavaScript я не могу использовать такой подход. Конструктору new Promise() требуется параметр обратного вызова, поэтому я не могу передать экземпляр Promise в качестве параметра.

Итак, мой вопрос: как я могу предопределить собственное обещание JavaScript, передать его в качестве параметра для функции и разрешения?


person Glen Swift    schedule 10.05.2014    source источник
comment
@ user2864740 Я знаю, что это старый комментарий, но это шутка?   -  person Mathletics    schedule 23.11.2015
comment
@Математика Вовсе нет. Это был серьезный комментарий, иллюстрирующий недопустимое (и недавно исправленное) написание с целью инициировать исправление от первоначального автора.   -  person user2864740    schedule 23.11.2015
comment
@Математика Спасибо)   -  person Glen Swift    schedule 23.11.2015


Ответы (2)


Поток выполнения будет немного другим, но в основном работает так же:

function some(resolve, reject) {
    resolve();
}

var promise = new Promise(some);

promise.then(/*  callback cool things   */);

Вместо того, чтобы some передавать само обещание, ему передаются функции resolve и reject. Так что зависимость как раз обратная.

person Felix Kling    schedule 10.05.2014

Вот базовая реализация, которая сохранит поток вашего приложения как есть.

Не используйте это в реальной жизни — вы потеряете безопасность броска (спасибо @BenjaminGruenbaum за подсказку).

var MyDeferred = function() {
    var _resolve,
        _reject,
        capturedPromise = new Promise(function(resolve, reject){
            _resolve = resolve;
            _reject  = reject;
        });

    return {
        'resolve' : _resolve,
        'reject'  : _reject,
        'then'    : function() { capturedPromise.then.apply(capturedPromise, arguments); },
        'catch'   : function() { capturedPromise.catch.apply(capturedPromise, arguments); }
    }
};
person vzwick    schedule 10.05.2014
comment
Ответ @Felix для меня более приемлем, но в любом случае спасибо за понимание - person Glen Swift; 11.05.2014
comment
Пожалуйста, не делайте этого на самом деле. Есть причина, по которой отложенные объекты плохи, а конструктор промисов лучше (безопасность бросков). - person Benjamin Gruenbaum; 11.05.2014