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