是否可以将一个异步事件及其回调包装在一个返回布尔值的函数中?

时间:2010-12-28 20:48:32

标签: javascript asynchronous callback

我正在尝试编写一个简单的测试,创建一个图像元素,检查图像属性,然后返回true / false。问题是使用onload事件会使测试异步。就它而言,这不是一个问题(使用回调,因为我在下面的代码中已经完成了很容易),但我无法弄清楚的是如何将它封装到一个返回布尔值的函数中。 p>

我尝试了各种闭包,递归和自动执行功能的组合,但没有运气。

所以我的问题是:我是否密集并且忽略了一些简单的事情,或者这实际上是不可能的,因为无论如何,我仍然试图在同步期望中包含异步函数?

以下是代码:

var supportsImage = function(callback) {
  var img = new Image();
  img.onload = function() {
    //Check attributes and pass true or false to callback
    callback(true);
  };
  img.src = 'data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=';
};

supportsImage(function(status){
  console.log(status);  
});

要清楚,我想要的是能够将它包装成可以像以下一样使用的东西:

if (supportsImage) {
  //Do some crazy stuff
}

谢谢!

(顺便说一下,我知道有很多关于同步与异步混淆的SO问题。如果这可以减少到以前的答案,那就道歉了。)

3 个答案:

答案 0 :(得分:2)

简短回答:不,你不能......

答案 1 :(得分:2)

不,但你可以把你的“疯狂的东西”传递给supportsImage,例如

supportsImage(function(result){
    if(result) {
        //Do some crazy stuff
    }
});

答案 2 :(得分:1)

为什么不设计你的代码,以便在你的回调中“做一些疯狂的东西”? 这就是回调应该如何运作,你仍然试图同步思考。

var supportsImage = function(callback) {
  var img = new Image();
  img.onload = function() {
    //Check attributes and invoke callback if true
    callback();
  };
  img.src = 'data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=';
};

supportsImage(function() {
  // Do some crazy stuff  
});