我希望为特定于应用程序的 AJAX 控制器实现一个 Inteceptor Pattern。
我的应用程序中的任何 AJAX 请求都会调用 Authenticator.request(),它会拦截响应,检查某些状态(例如 401、403、503),根据它们执行特定于应用程序的显示功能(即,如果状态 401 是,则显示 LoginDialog已收到)。我的问题源于对 dojo 的 Promises 的混淆。
- 如何将成功的请求传递回原始调用方法?
- 当我调用 dojo.promise.Promise.cancel() 时,我希望链接停止。但是,这只是运行 errback 函数。这意味着需要在调用函数的每个 errback 方法中放置逻辑,以区分取消的请求和错误。
谁能向我解释在这种情况下如何使用 Promises?
提前致谢!
这是我认为我可以做的一个例子......
require(["dojo/request"], function(request){
auth = {
request: function() {
var promise = request(arguments);
return promise.always(function (response) {
console.log("always called", response);
switch (response.response.status)
{
case 404:
console.log(404, response);
return "cancelled";
break;
}
});
}
};
});
auth.request('example.json').then(function(text){ console.log('success!', text) }, function(error){
console.log('error!', error);
});
如果这对将来的任何人有帮助,这就是我最终实现的(基于戴夫的回答)......
require(["dojo/request", "dojo/errors/CancelError"], function(dRequest, CancelError){
auth = {
request: function(url, options) {
var promise = dRequest(url, options);
return promise.response.then(
function (response) {
return response;
},
function (error) {
var error,
cancelError = new CancelError(error.message);
cancelError.response = error.response;
console.log("error", error, cancelError);
switch (error.response.status)
{
case 404:
console.log(404, "canceled");
throw cancelError;
}
throw error;
}
);
},
cancelTrap: function (errorBack, cancelBack) {
return function (error) {
throw (error instanceof CancelError)
? cancelBack && cancelBack(error) || error
: errorBack && errorBack(error) || error;
}
}
};
});
...然后可以像这样使用...
r = auth.request('something.json');
r.then(
function(text){
console.log('success! > this', this)
console.log('success!', text)
return text;
},
auth.cancelTrap(
function (error) {
console.log('error!', error);
throw error;
},
function (cancelError) {
console.log('cancelError!', cancelError);
throw cancelError;
}
)
).then(
function(text){
console.log('success2!', text)
},
auth.cancelTrap(
function (error) {
console.log('error2!', error);
throw error;
},
function (cancelError) {
console.log('cancelError2!', cancelError);
throw cancelError;
}
)
);