延期承诺价值未更新/解决/延期

dor*_*ork 0 javascript promise angularjs meteor

我有一个控制器功能,可以创建一些东西 调用该函数时,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);
})();
Run Code Online (Sandbox Code Playgroud)

这是控制器:

(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);
})();
Run Code Online (Sandbox Code Playgroud)

当我检查的价值responsegetStatus的的服务,其状态更改每次调用时(队列- >处理......处理- >创建).然而,价值status控制器始终queue.

如何获得要解决的承诺值?

jfr*_*d00 5

createSomething()getStatus()需要创造并回报自己的承诺.在所有情况下,他们都无法分享承诺并正常工作.

此外,他们应该在每次调用时创建并返回一个唯一的承诺,而不是每次调用时都有相同的承诺.请记住,承诺是单向状态机.一旦解决或拒绝,他们的状态永远不会改变,即使他们再次被召唤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;
    }
Run Code Online (Sandbox Code Playgroud)