Javascript XHR失败时的回退,在XHR函数之外

Javascript XHR失败时的回退,在XHR函数之外,javascript,jquery,Javascript,Jquery,我正在做一个XMLHttpRequest,如果失败,我想退一步做其他事情(读取本地文件),但我想在XHR函数(getDBfileXHR)本身之外做 我也在使用Jquery 考虑到它似乎不适用于.done()和.fail()这一事实,它可能与延迟变量或其他东西一起工作,这怎么可能呢 getDBfileXHR( encode_utf8("http://john:hispasswd@mysite.com/DBfile.jsonp") ); //here I want to do something e

我正在做一个XMLHttpRequest,如果失败,我想退一步做其他事情(读取本地文件),但我想在XHR函数(getDBfileXHR)本身之外做

我也在使用Jquery

考虑到它似乎不适用于
.done()
.fail()
这一事实,它可能与延迟变量或其他东西一起工作,这怎么可能呢

getDBfileXHR( encode_utf8("http://john:hispasswd@mysite.com/DBfile.jsonp") );
//here I want to do something else if getDBfileXHR fails like this :
fallbackToLocalDBfile();


function getDBfileXHR(url) {
    var request = new XMLHttpRequest();
    request.open("GET", url, true); //3rd parameter is sync/async
    request.onreadystatechange = function() {      //Call a function when the state changes.
       if (request.readyState == 4) {
          if (request.status == 200 || request.status == 0) {
             console.log('we get a response from XHR');
             var jsonText = request.responseText.replace("callback(", "");
             jsonText = jsonText.replace(");", "");
             storeJsonInProdata(JSON.parse(jsonText));
             dbReadyDeferred.resolve(); 
          } else {
            console.log('error : request.status = '+request.status);
          }
       }
    }
    console.log("Sending XMLHttpRequest...");
    request.send();
}

function fallbackToLocalDBfile(){
    $.get('proDB.jsonp').done(function(data){
        console.log(data);
        //storeJsonInProdata(data);
        //dbReadyDeferred.resolve();
    });
}

嗯,大概是这样的:

   var d=$.Deferred()

    function getDBfileXHR(url) {
     ....
           if (request.readyState == 4) {
            ...
                 d.resolve(_MyData); 
              } else {
                console.log('error : request.status = '+request.status);
                d.reject(_myError);

              }
           }
        }
        console.log("Sending XMLHttpRequest...");
        request.send();
    }

    d.done(function (a){...}).fail(function (b){});