Javascript 当承诺准备好的时候解决

Javascript 当承诺准备好的时候解决,javascript,angularjs,angular-promise,angular-routing,Javascript,Angularjs,Angular Promise,Angular Routing,我对AngularJS是新手。我需要在路由更改期间进行异步外部调用(一些API),并在该调用返回一些有效的JS对象时显示新的页面内容,例如var MySpecialObject 我会将新视图显示延迟最多3秒,直到对象准备就绪。所以,若我在更短的时间内得到这个对象,那个么我会希望立即显示新的内容 1.开始通话的最佳方式是什么 2.定义此对象后,如何显示新视图 我尝试使用routeresolve。下面的代码是我成功开始使用的代码,但我认为它不能很好地解决“承诺”问题。将对象返回到页面后,如何显示新视

我对AngularJS是新手。我需要在路由更改期间进行异步外部调用(一些API),并在该调用返回一些有效的JS对象时显示新的页面内容,例如
var MySpecialObject

我会将新视图显示延迟最多3秒,直到对象准备就绪。所以,若我在更短的时间内得到这个对象,那个么我会希望立即显示新的内容

1.开始通话的最佳方式是什么

2.定义此对象后,如何显示新视图

我尝试使用route
resolve
。下面的代码是我成功开始使用的代码,但我认为它不能很好地解决“承诺”问题。将对象返回到页面后,如何显示新视图?换句话说,我想在对象准备就绪时取消超时

 app.controller('PageCtrl', function($scope) {
   $scope.$on('$routeChangeStart', function(next, current) { 
      //API call here
   });

 app.config(['$routeProvider', function ($routeProvider) {
   $routeProvider
   .when("/", {templateUrl: "partials/home.html", 
             controller: "PageCtrl", 
             resolve:{
                        delay: function ($q, $timeout) {
                            var defer = $q.defer();
                            $timeout(function () {
                              if(typeof MySpecialObject !== 'undefined')  
                                defer.resolve('Resolve'); 
                            }, 3000);
                            return defer.promise;
                        }
                    }

             })

您不需要添加延迟。由于您正在声明resolve函数,路由器知道在承诺的解析被实际解析之前,不会实际导航到新路由(从而呈现视图)

您想要的可以写为:

app.config(['$routeProvider', function ($routeProvider) {
       $routeProvider
       .when("/", {templateUrl: "partials/home.html", 
                 controller: "PageCtrl", 
                 resolve:{
                            yourData: function ($q) {
                                var defer = $q.defer();

                                // do some work that will resolve the promise

                                return defer.promise;
                            }
                        }

                 })
并且解析的数据可以像这样注入控制器:

app.controller('DestinationController', function($scope, yourData) {
   $scope.data = yourData;
});

我不太清楚如何解决我的承诺。在我的例子中,解析涉及调用并检查是否存在有效的JS对象。我在哪里以角度的方式插入该功能?您在哪里拨打电话?你们有外部休息服务吗?也许是角度服务?谢谢。我真的不能控制这个电话。我必须调用触发Ajax调用的函数,唯一的成功检查是响应中是否存在某个JS对象。好的,因此您可以将关于的注释替换为:if(typeof theVariable=='undefined')defer.reject('variable not set');else defer.resolve(变量);谢谢我知道我的问题在哪里。若对象立即可用,则上述方法肯定有效。但是如果这个对象在很短的时间内变得可用,比如0.2秒或0.5秒,这取决于我的呼叫响应。我如何在“yourData”函数中处理这个问题?是否设置检查此对象的间隔?