【问题标题】:jQuery: $.get(url) breaks my sequential script executionjQuery: $.get(url) 破坏了我的顺序脚本执行
【发布时间】:2014-04-28 12:38:57
【问题描述】:

我的注意力是检查一个计算出来的 Image URI,如果它存在的话……

如果我对图像执行此操作,则会显示为叠加层:

$.get(first_url).done(function(){
  $('#any_DOM_id').append('<img id="first_image" src="'+first_url+'"/>');
}).fail(function(){
  $('#any_DOM_id').append('<img id="first_image" src="'+fallback_url+'"/>');
});

/*** HERE is something big happening and is calculated ***/
.
. 
.
. 
.
$.get(second_url).done(function(){
  $('#any_DOM_id').append('<img id="second_image" src="'+second_url+'"/>');
}).fail(function(){
  $('#any_DOM_id').append('<img id="second_image" src="'+fallback_url+'"/>');
});
.
. 
.
$.get(third_url).done(function(){
  $('#any_DOM_id').append('<img id="third_image" src="'+third_url+'"/>');
}).fail(function(){
  $('#any_DOM_id').append('<img id="third_image" src="'+fallback_url+'"/>');
});
.
. 
.
$('#any_DOM_id').append('<img id="fourth_image" src="'+fourth_url+'"/>');

我的顺序年表已损坏,因此图像在图层中的位置不正确。 我是否必须在所有图像上使用 $.get,还是 $.get 总是会杀死 Chronology?

编辑:

这就是我正在做的事情:

图像必须按如下顺序排列:

<style>
  .image_wrapper{
    position:relative;
  }
  .image_wrapper img{
    position:absolute;
  }     
</style>
<div id="image_wrapper">
  <img id="first_image" src="first_url"/>
  <img id="second_image" src="second_url"/>
  <img id="third_image" src="third_url"/>
  <img id="fourth_image" src="fourth_url"/>
</div>

【问题讨论】:

  • $.get() 是异步的
  • 有同步挂件吗?
  • 可能与 $.ajax async: false ??对吗?
  • @Viktor 正如@Karl-AndréGagnon 所注意到的,使用$.ajax 和async: false 自jQuery 1.8 起已弃用。
  • 当您添加许多具有相同 id 的图像时,并不清楚您真正想要什么。

标签: javascript jquery ajax asynchronous get


【解决方案1】:

像老板一样使用.reduce()

[first_url, second_url, third_url, fourth_url].reduce(function(promise, url) {
    return promise.then(function() {
        return $.get(url);
    }).then(function(urlContents) {
        $('#any_DOM_id').append('<img id="my_image" src="'+url+'"/>');
    }).then(null, function() {
        $('#any_DOM_id').append('<img id="my_image" src="'+fallback_url+'"/>');
        return $().promise();
    });
}, $().promise());

【讨论】:

  • ID 重复,但 +1 表示像老板一样减少。
  • 但是请求是顺序的
  • @dystroy 并发请求更简单,但 OP 想要顺序?
  • 我认为他宁愿把正确的东西放在正确的地方。但我不是 100% 确定。编辑:我已经多次阅读这个问题......我不明白,尤其是添加了许多具有相同 ID 的图像的部分:\
  • $.when.apply([url1,url2,url3,url4].map($.get).map(function(p){ p = p.then(null,function(e,i){ return $.get(fallback_urls[i]);}).then(function(a1,a2,a3,a4){ /* append all
【解决方案2】:

你可以使用 always 回调:

$.get(first_url).done(function(){
    $('#any_DOM_id').append('<img id="my_image" src="'+first_url+'"/>');
}).fail(function(){
    $('#any_DOM_id').append('<img id="my_image" src="'+fallback_url+'"/>');
}).always(function(){
    $('#any_DOM_id').append('<img id="my_image" src="'+second_url+'"/>');
    $('#any_DOM_id').append('<img id="my_image" src="'+third_url+'"/>');
    $('#any_DOM_id').append('<img id="my_image" src="'+fourth_url+'"/>');
});

添加要在 Deferred 对象被解析或拒绝时调用的处理程序。

jQuery .always()


编辑

您可以创建带有回调的函数。回调接收 url (fallback 或 good one) 该函数接收 URL 数组并按顺序执行请求:

checkURI([first_url, second_url, third_url, fourth_url], function(src){
    $('#any_DOM_id').append('<img id="my_image" src="'+src+'"/>');
})

function checkURI(uri, callback){
    get(0)
    function get(i){
        if(typeof uri[i] !== 'undefined')
            $.get(uri[i])
            .done(function(){
                callback(uri);
                get(i++);
            }).fail(function(){
                callback('YOUR FALLBACK URL');
                get(i++);
            });
    }
}

【讨论】:

  • 最后三张图片加载多次后,所以我不能那样做
  • @Viktor 查看我的编辑,我创建了一个可以重复使用的函数。
  • 你确定这不是 `!== 'undefined`` 吗?此外,@Viktor 的解决方案是使用像 Bluebird 这样的真正的 promise 库,它会很乐意在早餐时解决这类问题,而不是使用 jQuery 极其糟糕的 promise。
【解决方案3】:

或者作为 if 中的 check_function?!?

if(check_uri($uri)){
  $('#any_DOM_id').append('<img id="my_image" src="'+first_url+'"/>');
}else{
  $('#any_DOM_id').append('<img id="my_image" src="'+fallback_url+'"/>');
}

var check_uri = function($uri){
  $.get($uri).done(function(){
    return true;
  }).fail(function(){
    return false;   
  });
};

【讨论】:

  • 不,仍然是异步的。如果不等待取回一个值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-16
  • 2013-11-27
  • 2013-04-16
  • 2011-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多