2016-09-23 3 views
0

Я хочу разрешить объект обещания так же, как это было бы сделано. Угловая дефер.революция с объектом обещания Javascript. Путь другой: я хочу создать объект обещания, который нужно вернуть. Это обещание будет разрешено позже.Отложить/отложить обещание решить

В Угловое я бы написать так:

... 
$scope.checkThis = { test: false }; 

function getPromise() { 
    var deferred = $q.defer(); 
    var data = [1, 2, 3]; 

    function resolvePromise() { 
     deferred.resolve(data); 
    } 

    $scope.$watch("checkThis.test", function(newVal, oldVal) { 
     if (newVal) { 
      resolvePromise(); 
     } 
    }); 

    return deferred.promise; 
} 

$scope.getData1 = function() { 
    return getPromise(); 
}; 

$scope.getData2 = function() { 
    return getPromise(); 
}; 

... 

Как бы я добиться того же с простым объектом Javascript Promise? Я не вижу, как использовать конструктор Promise, поскольку есть одно событие ($ scope.checkThis.test становится истинным), что приведет к нескольким решениям.

+0

Что вы подразумеваете под «* событием, которое вызовет несколько решений»? Почему это будет работать для отсрочек, но не для конструктора обещаний? – Bergi

ответ

3

Стандартные обещания используют revealing constructor pattern. Существует простой и предпочтительный способ сделать это:

function getPromise() { 
    return new Promise(resolve => { 
    var data = [1, 2, 3]; 
    $scope.$watch("checkThis.test", function(newVal, oldVal) { 
     if (newVal) { 
     resolve(data); 
     } 
    }); 
    }); 
} 

Берегись! Стандартные обещания не будут вызывать угловой цикл дайджеста, изменения, внесенные в области видимости внутри обещаний, могут не отразиться на пользовательском интерфейсе и наблюдателях немедленно. Именно по этой причине вы не можете просто изменить $q обещания к стандарту Promise s.

Если по какой-либо причине вы не можете применить шаблон раскрывающего конструктора к вашему сценарию, вот способ создания аналогичного отложенного класса. Помните, что вы всегда можете избежать использования этого класса, я просто оставляю его здесь, поэтому посетители видят, как перейти от старых библиотек обещаний без необходимости реструктуризации их существующего кода. Новый код не должен использоваться:

class Deferred { 
    constructor() { 
    this.resolve = null; 
    this.reject = null; 
    this.promise = null; 

    this.promise = new Promise((resolve, reject) => { 
     this.resolve = resolve; 
     this.reject = reject; 
    }); 
    } 
} 
+1

Ну, этот класс «Отложенный» аннулирует все преимущества, которые имеет раскрывающийся шаблон конструктора. Не используйте его! – Bergi

+0

Если я правильно понимаю, вы создаете фабрику Promise, которая возвращает ожидающее обещание. Это работает в моем случае. Спасибо. @Bergi: почему бы не использовать его? – casenonsensitive

+0

@Bergi Совершенно верно. Я использую его только в сценариях, где есть распределенная система, и протокол на основе сообщений должен быть переведен на основанную на вызове реакцию. В этом случае единственный способ - хранить все ожидающие запросы (например, отложенные) на карте и извлекать и разрешать их при соответствующем ответе. –

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