deferred.resolve()会等到上一行完成吗?

时间:2018-02-23 12:39:42

标签: javascript jquery

deferred.resolve()会等到它完成之前的行吗?我的代码可以工作,但我无法判断deferred.resolve()是否在图像完成加载后实际发生,或者在图像请求启动后但在加载完成之前是否正在执行。

test = function(deferred) {
  $('<img src="https://upload.wikimedia.org/wikipedia/commons/7/72/%27Calypso%27_Panorama_of_Spirit%27s_View_from_%27Troy%27_%28Stereo%29.jpg">');
  deferred.resolve();
};

$.when($.Deferred(test)).then(function() {
  document.location = "https://stackoverflow.com/";
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>

或者我是否需要像这样添加一个加载处理程序?

test = function(deferred) {
  $('<img src="https://upload.wikimedia.org/wikipedia/commons/7/72/%27Calypso%27_Panorama_of_Spirit%27s_View_from_%27Troy%27_%28Stereo%29.jpg">').on("load", function() {
    deferred.resolve();
  });
};

$.when($.Deferred(test)).then(function() {
  document.location = "https://stackoverflow.com/";
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>

我在添加.on(“load”,handler)时发现的问题是,如果图像由于某种原因无法加载,则永远不会执行deferred.resolve()。我用坏网测试了这个。

我需要能够保证在图片加载后页面重定向发生,而且如果加载图像时出错,图像也不会阻止重定向发生。

1 个答案:

答案 0 :(得分:0)

load事件是异步的,为了确保在完成图像加载后执行下一行,确实需要添加处理程序。

有关详细信息,请参阅此处 jQuery .load(function) synchronous