Как сделать так, чтобы изображение проверки javascript существовало синхронно с функцией обратного вызова

У меня есть эта функция javascript, которая проверяет, существует ли определенный путь к изображению. в настоящее время функция не завершается до выполнения остальной части кода. Если бы кто-нибудь мог порекомендовать способ заставить программу дождаться завершения этой функции, прежде чем продолжить выполнение, это было бы потрясающе. Спасибо!

var flag = false;

function checkImageExists(imageUrl, callBack) {
    var imageData = new Image();
    imageData.onload = function () {
        callBack(true);
    };
    imageData.onerror = function () {
        callBack(false);
    };
    imageData.src = imageUrl;
}

checkImageExists(card.logoSrc, function (existsImage) {
    if (existsImage === true) {
        flag = true;
        console.info(card.logoSrc + ' ' + flag);
    } else {
        flag = false;
        console.info(card.logoSrc + ' ' + flag);
    }
});
console.info('flag ' + flag);

В журнале консоли этой программы отображается URL-адрес изображения и правильное значение флага, но оно отображается только после того, как журнал «флаг» + флаг всегда выполняется как ложный из-за того, что функция не завершает свое выполнение. Будем очень признательны за любые советы или рекомендации, еще раз спасибо!

Он работает так, как ожидалось, потому что ваш console.info('flag ' + flag) вне функции, поэтому он сначала дает значения, console.info внутри checkImageExists возвращается позже, потому что он проверяет наличие URL-адреса или нет

Ron 23.09.2018 19:07

Вы не можете. Вам нужно будет написать свою программу таким образом, чтобы значение не возвращалось немедленно.

JW. 23.09.2018 20:13
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
2
169
1

Ответы 1

Вы можете использовать async/await, чтобы заставить его работать так, как если бы он был синхронным.

function checkImageExists(imageUrl) {
  return new Promise((resolve, reject) => {
    let imageData = new Image();

    imageData.onload = function () {
        resolve(true);
    };
    imageData.onerror = function () {
        reject(false);
    };

    // not really sure why you have this here, but ok
    imageData.src = imageUrl;
  });
}

async function init() {
  try {
    const isImageLoaded = await checkImageExists(card.logoSrc);
    console.info(isImageLoaded);
  } catch(error) {
    console.error(error);
  }
}

init();

Обратите внимание, что это непроверенный код, он просто дает представление о решении.

Пример: https://repl.it/repls/KhakiTreasuredTasks

есть ли способ сделать это со старыми обещаниями javascript без использования функции стрелки async await? или еще лучше, как бы выглядел вызов функции, чтобы уловить обещание? спасибо @Baruch

Chris Kelly 24.09.2018 01:24

@ChrisKelly Почему ты хочешь делать это по-старому? Это встроенные функции javascript. Также обновлен ответ, чтобы выявить ошибки.

Baruch 24.09.2018 10:44

Я работаю с устаревшим кодом на своем рабочем месте и не смог использовать async await! Спасибо за вашу помощь

Chris Kelly 24.09.2018 19:29

Другие вопросы по теме