ronan_mac
ronan_mac

Reputation: 438

Handling jQuery deferred.done being called even though request is aborted?

I am writing a function that makes a http call to a web service, grabs some data and calls another function based on this data. If the service is down, the second function should not be called. I thought the obvious way to do this would be to write $.when(func1()).done(func2); but this will trigger func2 even when the request is aborted. I realise that I can do a workaround by calling func2 within the success function of func1's $.getJSON method, but I would like to use the deferred syntax if possible. Can anyone suggest how to handle this in a way that is consistent with the deferred object syntax?

function checker() {
    console.log("in checker");
    $.getJSON("http://djdjdjdjdjinvalidUrl.dkdkdk", function(data) {
        console.log("in success function");
    });
} 

function crosser(data) {
    console.log("in crosser");
}

$(document).ready(function(){
    $.when(checker()).done(crosser);
});

See jsFiddle for a live example.

Upvotes: 1

Views: 98

Answers (2)

Zathrus Writer
Zathrus Writer

Reputation: 4331

For asynchronous events like $.getJSON, you need to use the actual deferred object. I've updated your jsfiddle with this object in use: http://jsfiddle.net/wM7aP/1/

Code:

function checker() {
    var dfd = new jQuery.Deferred();
    console.log("in checker");
    $.getJSON("http://djdjdjdjdjinvalidUrl.dkdkdk", function(data) {
        //handle data here
        dfd.resolve( "hurray" );
    });
    return dfd.promise();
} 

function crosser(data) {
    console.log("in crosser");
}

$(document).ready(function(){
    $.when(checker()).done(crosser);
});

Upvotes: 0

Arun P Johny
Arun P Johny

Reputation: 388316

you need to return a promise from checker

function checker() {
    console.log("in checker");
    return $.getJSON("http://djdjdjdjdjinvalidUrl.dkdkdk", function(data) {
        console.log("in success function");
    });
} 

Demo: Fiddle

Also there is no need to use $.when()

$(document).ready(function(){
    checker().done(crosser);
});

Demo: Fiddle

Upvotes: 7

Related Questions