javascript - 延迟 promise 值未更新/解析/延迟

标签 javascript angularjs meteor promise

我有一个 Controller 函数来创建一些东西。调用该函数时,将运行 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);
})();

这是 Controller :

(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);
})();

当我检查服务getStatusresponse的值时,每次调用时状态都会发生变化(队列 ->处理...处理->创建)。但是, Controller 中的status值始终为queue

如何获得要解析的 promise 值?

最佳答案

createSomething()getStatus() 需要创建并返回自己的 Promise。他们无法在所有情况下共享 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;
    }

关于javascript - 延迟 promise 值未更新/解析/延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37290403/

相关文章:

javascript - 选择另一个下拉菜单时,Meteor 会动态过滤下拉菜单

javascript - 在 Meteor.js 中设置自动表单中省略字段的值

javascript - 键盘输出和键盘输入

javascript - 如何使用正则表达式获取字符串中的字母数字或数值?

javascript - 将多个字符串合并为一个字符串

javascript - 从 Meteor 的数据库中填充 HTML Select 下拉列表

javascript - 如何在ChartJS中使y轴仅整数缩放?

javascript - 日期持续时间/日期减法计算

javascript - Angularjs - 当 $http 内的范围值发生变化时,ng-show 不起作用

javascript - Angular 不绑定(bind) ng-click