in OpenLayers.Request call the "complete", "success" and "failure" callbacks from within a separate method, this allows executing the callbacks from outside and at the time it lmakes the most sense to the application, p=fvanderbiest, r=me (closes #2218)

git-svn-id: http://svn.openlayers.org/trunk/openlayers@9621 dc9f47b5-9b13-0410-9fdd-eb0c1a62fdaf
This commit is contained in:
Éric Lemoine
2009-08-13 19:47:08 +00:00
parent d83376de64
commit f587b05d35

View File

@@ -141,6 +141,54 @@ OpenLayers.Request = {
request.setRequestHeader(header, config.headers[header]);
}
var events = this.events;
// we want to execute runCallbacks with "this" as the
// execution scope
var self = this;
request.onreadystatechange = function() {
if(request.readyState == OpenLayers.Request.XMLHttpRequest.DONE) {
var proceed = events.triggerEvent(
"complete",
{request: request, config: config, requestUrl: url}
);
if(proceed !== false) {
self.runCallbacks(
{request: request, config: config, requestUrl: url}
);
}
}
};
// send request (optionally with data) and return
// call in a timeout for asynchronous requests so the return is
// available before readyState == 4 for cached docs
if(config.async === false) {
request.send(config.data);
} else {
window.setTimeout(function(){
request.send(config.data);
}, 0);
}
return request;
},
/**
* Method: runCallbacks
* Calls the complete, success and failure callbacks. Application
* can listen to the "complete" event, have the listener
* display a confirm window and always return false, and
* execute OpenLayers.Request.runCallbacks if the user
* hits "yes" in the confirm window.
*
* Parameters:
* options - {Object} Hash containing request, config and requestUrl keys
*/
runCallbacks: function(options) {
var request = options.request;
var config = options.config;
// bind callbacks to readyState 4 (done)
var complete = (config.scope) ?
OpenLayers.Function.bind(config.callback, config.scope) :
@@ -161,50 +209,21 @@ OpenLayers.Request = {
OpenLayers.Function.bind(config.failure, config.scope) :
config.failure;
}
var events = this.events;
request.onreadystatechange = function() {
if(request.readyState == OpenLayers.Request.XMLHttpRequest.DONE) {
var proceed = events.triggerEvent(
"complete",
{request: request, config: config, requestUrl: url}
);
if(proceed !== false) {
complete(request);
if (!request.status || (request.status >= 200 && request.status < 300)) {
events.triggerEvent(
"success",
{request: request, config: config, requestUrl: url}
);
if(success) {
success(request);
}
}
if(request.status && (request.status < 200 || request.status >= 300)) {
events.triggerEvent(
"failure",
{request: request, config: config, requestUrl: url}
);
if(failure) {
failure(request);
}
}
}
complete(request);
if (!request.status || (request.status >= 200 && request.status < 300)) {
this.events.triggerEvent("success", options);
if(success) {
success(request);
}
}
if(request.status && (request.status < 200 || request.status >= 300)) {
this.events.triggerEvent("failure", options);
if(failure) {
failure(request);
}
};
// send request (optionally with data) and return
// call in a timeout for asynchronous requests so the return is
// available before readyState == 4 for cached docs
if(config.async === false) {
request.send(config.data);
} else {
window.setTimeout(function(){
request.send(config.data);
}, 0);
}
return request;
},
/**