javascript - 在获取图像大小时绕过异步

标签 javascript jquery

我得到图像尺寸(宽度x高度)。图像的位置是 URL。我尝试了类似下面的代码块

var constants: {
       standImgDim: {
           small: '200x200',
           mid: '400x400'
       }
    };
<小时/>
this.getImgDim = function(targetImg) {
        var width=0, height=0, setStyleWidth = 0;
        $("<img/>")
            .attr("src", targetImg)
            .load(function() {
                width = this.width;
                height = this.height;
                var gotDim = width+'x'+height;

                    console.log(gotDim);
            });
   console.log('data');

    };

当前输出:

data
200x200

预期输出:

200x200
data

我知道结果是由于异步行为而产生的......

我也尝试过 $.Deferred.. 但它不起作用。因为我没有使用ajax(如下)

var deferred = new $.Deferred();

 $.ajax({
                    type: "GET",
                    url: targetImg,
                    dataType: "image/jpeg"
                }).done(function(data) {
                    deferred.resolve(data);
                }).fail(function(error) {
                    deferred.reject(error);
                });

                return deferred.promise();

有没有办法以同步方式/其他方式做到这一点?

最佳答案

在加载函数中添加回调:

this.getImgDim = function(targetImg, callback) {
        var width=0, height=0, setStyleWidth = 0;
        $("<img/>")
            .attr("src", targetImg)
            .load(function() {
                width = this.width;
                height = this.height;
                var gotDim = width+'x'+height;

                    console.log(gotDim);

                callback();
            });


    };

this.getImgDim('targetImage', function () {
       console.log('data');
});

唯一的异步函数是.load,因此回调允许的代码是在某种程度上返回到同步上下文,如果您需要访问加载的某些变量或某些输出数据函数,您可以通过回调传递它。

我认为你甚至可以通过以下方式传递上下文:

callback.bind(this);

关于javascript - 在获取图像大小时绕过异步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23197379/

相关文章:

javascript - jQuery 中的全局自定义事件

javascript - 如何获取点击时输入的值

JavaScript 深度优先搜索

Javascript SetInterval() 作用域问题

javascript - 在vue js中使用axios post方法下载文件

javascript - 带有 .on 的 jQuery 事件委托(delegate)(此引用)

jquery - 动画响应式 Svg-Map

javascript - 如何在 Javascript 中获取相对路径?

javascript - 在单独的进程中创建 iframe,这样它就不会阻塞父窗口的主线程

javascript - 准备文件下载时更改主体上的光标类型