我正在尝试编写一个简单的测试,创建一个图像元素,检查图像属性,然后返回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问题。如果这可以减少到以前的答案,那就道歉了。)
答案 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
});