Javascript AngularJS-promise不适用于$route

Javascript AngularJS-promise不适用于$route,javascript,angularjs,Javascript,Angularjs,我试着用承诺和ngRoute。我读过关于决心的书,但我无法让它起作用。模板只是获取promise对象,而不是消息数组。这就是它的样子: angular.module('myModule', ['ngRoute']) .factory('MessageResolver', ['$q', '$timeout', function($q, $timeout) { var x = function() {

我试着用承诺和ngRoute。我读过关于决心的书,但我无法让它起作用。模板只是获取promise对象,而不是消息数组。这就是它的样子:

angular.module('myModule', ['ngRoute'])

.factory('MessageResolver', ['$q', '$timeout', function($q, $timeout)
{                   
    var x = function()
    {                 
        var deferred = $q.defer();

        $timeout(function() 
        {
            deferred.resolve(['Hello', 'world!']);
        }, 2000);

        return deferred.promise;  
    }       

    return {
        getMessage : x
    }
}])

.controller('HelloCtrl', ['$scope', 'MessageResolver', function($scope, MessageResolver)
{                      
    $scope.messages = MessageResolver.getMessage();
}])
.config(['$routeProvider', function($routeProvider) 
{
    $routeProvider.when('/', 
    {
        templateUrl: 'index2.html', 
        controller: "HelloCtrl",
        resolve: ['MessageResolver']
    }); 
}])  

; 
感谢您的帮助。

来自文档:

工厂-{string | function}:如果是string,则它是服务的别名。否则,如果为函数,则注入该函数,并将返回值视为依赖项

因此,您的
服务
必须返回一个承诺才能解决问题。试试这个:

var解析器=['$q','$timeout',函数($q,$timeout)
{                   
var deferred=$q.deferred();
$timeout(函数()
{
延迟。解决(['Hello','world!']);
}, 2000);
回报。承诺;
}]
// ...
.config(['$routeProvider',函数($routeProvider)
{
$routeProvider.when(“/”,
{
templateUrl:'index2.html',
控制器:“HelloCtrl”,
解析:{'MessageResolver':解析程序}
}); 
}])  
如果您想将其用作服务:

angular.module('myModule', ['ngRoute'])

.factory('MessageResolver', ['$q', '$timeout', function($q, $timeout)
{                               
    var deferred = $q.defer();

    $timeout(function() 
    {
        deferred.resolve(['Hello', 'world!']);
    }, 2000);

    return deferred.promise;    
}])                

.controller('HelloCtrl', ['$scope', 'MessageResolver', function($scope, MessageResolver)
{                     
    MessageResolver.then(function(messages)
    {
        $scope.messages = messages;
    })                            

}])

.config(['$routeProvider', function($routeProvider) 
{
    $routeProvider.when('/', 
    {
        templateUrl: 'index2.html', 
        controller: "HelloCtrl",
        resolve: { 'MessageResolver': 'MessageResolver' }
    }); 
}])

工作演示:

感谢您的回复。这似乎很好,但我想避免任何全球性的。这就是为什么我决定尝试使用这项服务。当我不使用$routeProvider(由ng控制器定义的控制器)时,我的代码工作正常。我不需要等到所有的承诺都解决了才显示我的页面。我想要实现的就是在routnig中使用promise:)当我在控制器()中使用.then()时,我工作得非常好。我看起来非常难看。为什么在我不使用ngRoute的情况下它不起作用呢?我刚刚发现自动承诺取消包装自1.2.x以来一直被拒绝。所以问题是,为什么它在没有ngRoute的情况下工作?:)@是的,承诺不会在模板中展开。但是,您在Gist中发布的示例在使用
resolve
语法时进行了一些更改。我已经更新了答案。谢谢你的帮助。