Можно ли обернуть асинхронное событие и его обратный вызов в функцию, которая возвращает логическое значение? - PullRequest
1 голос
/ 28 декабря 2010

Я пытаюсь написать простой тест, который создает элемент изображения, проверяет атрибуты изображения, а затем возвращает true / false. Проблема в том, что использование события onload делает тест асинхронным. Само по себе это не проблема (использование обратного вызова, как я сделал в приведенном ниже коде, легко), но я не могу понять, как заключить это в одну функцию, которая возвращает логическое значение.

Я пробовал различные комбинации замыканий, рекурсии и самовыполняющихся функций, но безуспешно.

Итак, мой вопрос: я плотный и упускаю из виду что-то простое, или это на самом деле невозможно, потому что, несмотря ни на что, я все еще пытаюсь заключить асинхронную функцию в синхронные ожидания?

Вот код:

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 ]

2 голосов
/ 28 декабря 2010

Нет, но вы можете передать свои "сумасшедшие вещи" в supportsImage, например,

supportsImage(function(result){
    if(result) {
        //Do some crazy stuff
    }
});
2 голосов
/ 28 декабря 2010

Краткий ответ: Нет, ты не можешь ....

1 голос
/ 29 декабря 2010

Почему бы вам просто не спроектировать свой код так, чтобы "Делать какие-то безумные вещи" было в вашем обратном вызове? Вот как должны работать обратные вызовы, вы все еще пытаетесь мыслить синхронно.

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  
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...