解决承诺直到状态改变
resolve promise until state changes
我的 angular 应用程序中有一个隐藏页面,因此只有特殊 ID 用户才能访问它。为了实现它,当状态更改为该隐藏状态时,我向服务器发送 HTTP get 请求(因为只有服务器知道该特殊 ID)。
如果服务器用错误消息响应我,那么我会阻止状态更改过程,否则用户会转到该特殊页面。
这是我使用的代码:
angular
.run(["$rootScope", "$location", "$state", "mySvc", function ($rootScope, $location, $state, mySvc) {
var id = mySvc.getId();
$rootScope.$on( '$stateChangeStart', function(event, toState , toParams, fromState, fromParams) {
if(toState.name === "specialstate") {
mySvc.check(id)
.then(function(result) {
if(result.error !== 0) {
event.preventDefault();
}
}, function(error) {
event.preventDefault();
});
}
});
}]);
服务中的功能:
function check(id) {
var deferred = $q.defer();
$http({
url: "/api/url",
method: "GET",
headers: {'Content-Type': 'application/json'}
}).
then(function (result) {
console.log(result);
if(result.data.error === 0) {
deferred.resolve(result.data);
}
else {
deferred.reject(result.data);
}
}, function (error) {
deferred.reject(error);
});
return deferred.promise;
};
一切正常,除了一件事:状态正在改变,没有等待请求结果。我想我应该使用resolve,但我不知道如何正确使用它。
谢谢。
ui-路由器支持一个解析对象,该对象定义了一组在允许状态转换之前应该解析的数据(例如,来自服务器)。
.state('hidden', {
url: '/hidden',
...
resolve: {
data: function(mySvc) {
var id = mySvc.getId();
return mySvc.check(id).then(function(result) {
if (result.error !== 0) {
throw new Error("not allowed");
}
});
}
}
});
定义的 data
对象将在该隐藏状态下可供您的控制器使用,并且仅当它 returns 一个 2xx 状态代码并且有一个 error
属性 等于 0.
如果数据已解析,则会发生状态更改并实例化控制器。如果被拒绝,将发生 none。
作为个人笔记,我发现这是处理授权的好工具。
我的 angular 应用程序中有一个隐藏页面,因此只有特殊 ID 用户才能访问它。为了实现它,当状态更改为该隐藏状态时,我向服务器发送 HTTP get 请求(因为只有服务器知道该特殊 ID)。
如果服务器用错误消息响应我,那么我会阻止状态更改过程,否则用户会转到该特殊页面。
这是我使用的代码:
angular
.run(["$rootScope", "$location", "$state", "mySvc", function ($rootScope, $location, $state, mySvc) {
var id = mySvc.getId();
$rootScope.$on( '$stateChangeStart', function(event, toState , toParams, fromState, fromParams) {
if(toState.name === "specialstate") {
mySvc.check(id)
.then(function(result) {
if(result.error !== 0) {
event.preventDefault();
}
}, function(error) {
event.preventDefault();
});
}
});
}]);
服务中的功能:
function check(id) {
var deferred = $q.defer();
$http({
url: "/api/url",
method: "GET",
headers: {'Content-Type': 'application/json'}
}).
then(function (result) {
console.log(result);
if(result.data.error === 0) {
deferred.resolve(result.data);
}
else {
deferred.reject(result.data);
}
}, function (error) {
deferred.reject(error);
});
return deferred.promise;
};
一切正常,除了一件事:状态正在改变,没有等待请求结果。我想我应该使用resolve,但我不知道如何正确使用它。
谢谢。
ui-路由器支持一个解析对象,该对象定义了一组在允许状态转换之前应该解析的数据(例如,来自服务器)。
.state('hidden', {
url: '/hidden',
...
resolve: {
data: function(mySvc) {
var id = mySvc.getId();
return mySvc.check(id).then(function(result) {
if (result.error !== 0) {
throw new Error("not allowed");
}
});
}
}
});
定义的 data
对象将在该隐藏状态下可供您的控制器使用,并且仅当它 returns 一个 2xx 状态代码并且有一个 error
属性 等于 0.
如果数据已解析,则会发生状态更改并实例化控制器。如果被拒绝,将发生 none。
作为个人笔记,我发现这是处理授权的好工具。