#javascript #asynchronous
#javascript #асинхронный
Вопрос:
Мой код выглядит следующим образом:
myObject.myMethod('imageCheck', function () {
var image = new Image();
image.onerror = function() {
return false;
};
image.onload = function() {
return true;
};
image.src = 'http://www.example.com/image.jpg';
});
Но это не работает, предположительно потому, что мои возвраты возвращаются только из анонимной функции, а не из той, которая называется imageCheck. Как я могу переписать это так, чтобы вся функция возвращалась как true или false?
Комментарии:
1. Что такое myMethod и что такое imageCheck? Почему вы возвращаете что-то в функции-обработчике для асинхронного вызова? Эти возвращаемые данные ничего не делают. Вы должны использовать стиль программирования «продолжение» для асинхронности.
Ответ №1:
вы должны использовать обратные вызовы, например:
myObject.myMethod('imageCheck', function () {
var image = new Image();
image.onerror = function() {
returnCallback(false);
};
image.onload = function() {
returnCallback(true);
};
image.src = 'http://www.example.com/image.jpg';
});
function returnCallback(bool){
//do something with bool
}
Комментарии:
1. Ага. Это определенно правильный путь. Если вы хотите быть педантичным, вы могли бы частично применить true / false к ReturnCallback и избежать дополнительных определений функций. Это более «функциональный» способ сделать то же самое. Работает любой способ.
2. В этом случае MyObject.myMethod на самом деле взят из сторонней библиотеки, поэтому я должен убедиться, что эта функция возвращает true или false. Как мне использовать этот метод для этого?
3. По сути, MyObject.myMethod(‘imagecheck’,function () {} ); должен возвращать либо true, либо false. Если бы это не была проверка асинхронности, я бы просто закончил с
return bool;
, но я не могу понять, как дождаться запуска onerror или onload, а затем вернуться с логическим значением. Возможно, я недостаточно понимаю эту тему, поэтому, если это не имеет смысла, тогда мне нужно больше прочитать об асинхронных материалах!4. асинхронный не может выполнить возврат. это потому, что js выполняется через весь скрипт, даже если он еще не выполнен, поэтому, когда асинхронный выполняется и ему нужно что-то сделать, поэтому единственный способ симулировать возврат — это выполнить обратный вызов fn
5. @RichBradshaw было бы здорово, если бы вы поделились другим подходом