【问题标题】:deferred promise value not updating/resolving/deferring延迟承诺值不更新/解决/延迟
【发布时间】:2016-05-18 13:03:34
【问题描述】:

我有一个控制器函数可以创建一些东西。调用该函数时,会运行 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);
})();

当我检查服务的getStatus中response的值时,每次调用它时状态都会改变(队列->处理...处理->创建)。但是,控制器中status的值始终是queue。

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

【问题讨论】:

  • 呃,createSomething 和 getStatus 都在尝试解决相同的延迟问题?

标签: javascript angularjs meteor promise


【解决方案1】:

createSomething() 和getStatus() 需要创建并返回他们自己的promise。他们无法分享承诺并在所有情况下都能正常工作。

此外,它们应该在每次调用时创建并返回一个唯一的 Promise,而不是每次调用时都返回相同的 Promise。请记住,promise 是单向状态机。一旦解决或拒绝,它们的状态永远不会改变,即使 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;
    }

【讨论】:

  • 哦。所以我应该为每个返回承诺的函数设置一个$q.defer()。谢谢!现在可以了! :)
猜你喜欢
  • 1970-01-01
  • 2015-03-08
  • 1970-01-01
  • 2015-06-22
  • 2015-03-27
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多