значение отложенного обещания не обновляется / не разрешается / не откладывается

0

У меня есть функция контроллера, которая создает что-то. Когда функция вызывается, запускается setInterval чтобы получить статус элемента.

Вот услуга:

(function () {
    'use strict';

    function myService($q) {
        let deferred = $q.defer();

        function createSomething(name) {
            Meteor.call('createSomething', name, (err, res) {
                if (err) {
                    deferred.reject(err);
                } else {
                    //value returned is the created item (id, name, status)
                    deferred.resolve(res);
                }
            });

            return deferred.promise;
        }

        function getStatus(id) {
            Meteor.call('getStatus', id, (err, res) {
                if (err) {
                    deferred.reject(err);
                } else {
                    //statuses are queued, processing, created
                    deferred.resolve(res);
                }
            });

            return deferred.promise;
        }

        return {
            createSomething: createSomething,
            getStatus: getStatus
        }
    }

    angular.module('myApp').factory('myService', myService);
})();

И вот контроллер:

(function () {
    'use strict';

    function myController($scope, myService) {
        let ctrl = this;

        ctrl.create = (name) => {
            myService.createSomething(name)
                .then((item) => {
                    ctrl.statusInterval = setInterval(() => {
                        myService.getStatus(item.data.id)
                            .then((status) => {
                                //status is always 'queued' :(
                                if (status.data.status === 'created') {
                                    clearInterval(ctrl.statusInterval);
                                    //do something
                                }
                            });
                    }, 5000);
                });
        };
    }

    angular.module('myApp').controller('myController', myController);
})();

Когда я проверяю значение response в getStatus службы, статус изменяется каждый раз, когда он вызывается (очередь → обработка... обработка → создана). Однако значение status в контроллере всегда равно queue.

Как я могу получить значение обещания?

  • 0
    Э-э, и createSomething и getStatus пытаются разрешить одно и то же отложенное?
Теги:
promise
meteor

1 ответ

5
Лучший ответ

createSomething() и getStatus() должны создавать и возвращать свои собственные обещания. Они не могут делиться обещанием и работать должным образом во всех случаях.

Кроме того, они должны создавать и возвращать уникальное обещание каждый раз, когда они называются, а не одно и то же обещание каждый раз, когда они вызываются. Помните, что обещания - это односторонние государственные машины. После разрешения или отклонения их состояние никогда не изменяется, даже если на них снова вызывается reject() resolve() или reject().

Вот пример:

    function createSomething(name) {
        // create a unique deferred inside this function each time you call it
        let deferred = $q.defer();
        Meteor.call('createSomething', name, (err, res) {
            if (err) {
                deferred.reject(err);
            } else {
                //value returned is the created item (id, name, status)
                deferred.resolve(res);
            }
        });

        return deferred.promise;
    }
  • 0
    Ой. Поэтому я должен установить $q.defer() для каждой функции, которая затем возвращает обещание. Спасибо! Это работает сейчас! :)
  • 0
    ты спас мне много боли, братан. Благодарю.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню