【问题标题】:Setting a boolean return value to a jQuery function call将布尔返回值设置为 jQuery 函数调用
【发布时间】:2015-08-24 14:10:13
【问题描述】:

我这里有一个函数可以检查图片的尺寸是否为 100 x 100 像素,如果是则返回 true

function checkDims(url) {
    var valid = $("<img/>").attr("src", url).load(function() {
        s = { w: this.width, h: this.height };
        if (s.w == 100 && s.h == 100) {
            return true;
        }
        else {
            return false;
        }
    });
    return valid;
}

我想设置一个名为 valid 的变量,该变量使用 .load function to get the image size of a remote URL 进行检查,我希望它相应地返回 true 或 false。我知道我将它设置为一个 jQuery 对象,但我想从内部函数中获取结果。

我试过了:

function checkDims(url) {
    var valid;
    $("<img/>").attr("src", url).load(function() {
        s = { w: this.width, h: this.height };
        if (s.w == 100 && s.h == 100) {
            valid = true;
        }
        else {
            valid = false;
        }
    });
    return valid;
}

但是当我调用 checkDims 函数时,它给了我 undefined 作为有效值

所以如果我打电话给

var s = checkDims(a_url)

。它会返回

未定义

【问题讨论】:

  • load 是异步调用,不能从异步调用返回。到设置真假的时候,函数已经退出了。
  • 我将如何解决这个问题。如果可能的话?我需要一个 setInterval 函数来等待吗?
  • 您需要更改逻辑,以便回调触发流程的下一步。
  • 我明白了。好的,谢谢
  • @epascarello 那么为什么如果我在调用中放置一个 console.log 它会打印呢?

标签: jquery


【解决方案1】:

您需要将逻辑分解为两个步骤,因为这是一个异步调用。

function checkDims(url, callback) {
    $("<img/>").attr("src", url).load(function() {
        callback (this.width == 100 && this.height == 100);   
    }).on("error") { callback(false); });
}

function nextStep(isValid) {
    alert("The image is " + ((isValid) ? "" : "not ") + "valid"
}

checkDims("foo.gif", nextStep);

【讨论】:

  • 那么nextStep函数应该返回true还是false?如果我想设置 var result = checkDims("foo.gif",nextStep)?
  • 你不能从这里返回!从异步调用返回是不可能的。你需要分解你的逻辑,所以你在调用 checkDims 之后所做的一切都需要在函数 nextStep 中。
  • 那么没有办法将checkDims设置为nextStep回调的结果?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-29
  • 2013-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多