使用$route解析站点页面解析微风查询/Q承诺



在渲染视图之前,我在执行具有角度分辨率的微风查询时遇到问题。我正试图在用微风渲染视图之前从服务器获取一些数据。我正在使用

$routeProvider.when('/countries', { templateUrl: 'App/partials/countries.html', controller: Ctrl, resolve: Ctrl.resolve }).

控制器和服务片段:

function Ctrl($scope, Q, datacontext, countries) {
//...
}
function getCountries(forceRefresh) {
            var query = entityQuery.
                from("countries").
                orderBy("name");
            return manager.executeQuery(query).
            then(getSucceeded);
        }
        function getSucceeded(data) {
            return data.results;
        }

这使得我的视图永远不会呈现:

Ctrl.resolve = {
    countries: function (datacontext) {
        return datacontext.getCountries();
    }
}

而如果我创建一个需要更长时间的计时器,它就会工作。我试过用$q包装它,但我似乎无法让它发挥作用。

由于超时,这将呈现视图:

Ctrl.resolve = {
    countries: function (datacontext) {
        return datacontext.getCountries();

    },
    delay: function ($q, $timeout) {
        var delay = $q.defer();
        $timeout(delay.resolve, 6000);
        return delay.promise;
    }
}

如果有人能帮我,那就太好了。我不确定我是否做错了什么,或者Q承诺或决心是否有局限性。

我感觉到你的痛苦。$q/route解析实现中的一个错误是解析不遵循Q.then方法。这违反了普遍接受的支持可互换promise实现(叹息)的做法。

但这并不是真正的问题。真正的问题是Angular不知道异步方法何时得到解决。您必须在成功和失败回调中手动调用$rootScope.$apply。Angular的$http和$q可以为您完成此操作(或等效操作)。自己做好是一个PITA。

正如我所说,我们感受到你的痛苦。很快,我们将发布一个小型Q插件,它可以将Q承诺转换为$Q承诺,并且应该可以减轻这种痛苦。至少对我来说是这样:-)。

简而言之,在你的应用程序启动的地方附近找一个地方,并扩展Q,比如这样:

angular.module('app').factory('util',['$q','$rootScope',util]);函数util($q,$rootScope){extendQ();…此处的其他实用程序。。。//Monkey将$q方法补丁到q.js的promise原型中//示例用法:return manager.executeQuery(qry).to$q(succ,fail);函数extendQ(){var promise=Q.defer().proice;var fn=Object.getPrototypeOf(promise);if(fn至$q)return;//已扩展fn.to$q=函数(成功、失败){返回$q(this,success,fail);};}函数到$q(qPromise,success,fail){var d=$q.dedefe();qPromise.then(函数(数据){if(数据===未定义){logger.log错误("编程错误:没有数据。"+"也许成功回调没有返回值或"+"失败回调未重新抛出错误");//如果错误被捕获并且没有在早期的承诺链中重新抛出//你将带着数据到达这里===未定义。//忽略重新投掷是一种常见的、偶然的疏忽。//为了安全起见,让每次成功回调都返回一些东西//如果数据未定义,请在此处设置陷阱}d.解析(数据);$rootScope$apply();//看见https://groups.google.com/forum/#!主题/角度/LGoBCQ-V_tM}).fail(函数(错误){d.拒绝(错误);$rootScope$apply();//看见https://groups.google.com/forum/#!主题/角度/LGoBCQ-V_tM});if(成功||失败){d.promise=d.promise。然后(成功,失败);}return d.promise;}

现在这样使用它(基于您的示例):

函数getCountrys(){var query=微风。EntityQuery.from("countries").orderBy("name");return manager.executeQuery(query).to$q(getSuccessed);函数getSuccessed(data){return data.results;}}

附录

有人问我:

";

我试过了。。。无法使其发挥作用。具体来说,我尝试了这个:

函数到$q(qPromise,success,fail){var promise=$q.when(qPromise);if(成功||失败){promise=承诺。然后(成功,失败);}回报承诺;}

我认为$q.when有问题。

相关内容

  • 没有找到相关文章

最新更新