0

我必须在给定的时间点检查设备中互联网访问的可用性。因此,我正在对服务器进行 ajax 调用以加载一个小图像。我遇到了 jQuery Deferred 并尝试使用它。

var spacer = "some url";
var getImage;
var connectionAlive;
function checkOnline(spacer) {
    getImage = $.ajax({url:spacer})
                .done(function() {console.log('Connection alive');connectionAlive = true;})
                .fail(function() {console.log('Connection dead');connectionAlive = false;});
    if(connectionAlive === true) {
        return true;
    }
    return false;
}

现在我必须在某些事件发生时调用这个 checkOnline 函数。所以,我正在调用该函数并等待承诺得到解决。

$(document).on('click','#explore',function() {
    checkOnline(spacer);
    getImage.done(function() {
            // Do something
            })
 });

这仅在第一次有效,我认为这是因为延迟对象状态在解决后保持不变。我应该如何编写我的代码,以便每次点击事件触发时我都可以实际检查连接?

新代码:

嗨,我遵循了上面的代码,但点击事件仍然只能在第一次正常工作。

    var connectionAlive;
var url = "http://example.com";
function checkOnline(url, callback1,callback2) {
    $.ajax({url:url})
        .done(function() {console.log('Connection alive');connectionAlive = true;})
        .done(callback1)
        .fail(function() {console.log('Connection dead');connectionAlive = false;})
        .fail(callback2);

}

$(document).on('click','#explore',function() {
    checkOnline(url, function(){
        console.log('Connection Alive from event');
    },function() {
        console.log('Connection Dead from event');
    });

});
4

1 回答 1

1

更改checkOnline以返回承诺本身:

$(document).on('click','#explore',function() {
     checkOnline('url.com').done(function(){
          // Do something
     });
});

var connectionAlive;
function checkOnline(url) {
    return $.ajax({url : url})
            .done(function() {console.log('Connection alive');connectionAlive = true;})
            .fail(function() {console.log('Connection dead');connectionAlive = false;});
}

或将其更改为进行回调:

$(document).on('click','#explore',function() {
     checkOnline('url.com', function(){
          // Do something
     });
});

var connectionAlive;
function checkOnline(url, callback) {
    $.ajax({ url : url})
     .done(function() {console.log('Connection alive');connectionAlive = true;})
     .done(callback)
     .fail(function() {console.log('Connection dead');connectionAlive = false;});
     // Do not try to return connectionAlive from here,
     // it will return the value before the ajax response arrived
}
于 2012-06-29T02:25:58.743 回答