Javascript - обратный вызов или вызов функции из другой функции - PullRequest
0 голосов
/ 22 марта 2020

У меня есть следующий код:

function download(url, callback) {
    setTimeout(() => {
      // script to download the picture here
      console.log(`Downloading ${url} ...`);

      callback();

   }, 3* 1000);
}


download(url);

Зачем мне нужна функция обратного вызова. Разве я не могу просто создать другую функцию и вызвать ее из функции загрузки? Я не вижу смысла в том, что люди говорят, что для асин c программирования нужны обратные вызовы.

1 Ответ

1 голос
/ 22 марта 2020

Обратные вызовы необходимы, когда значение зависит от ответа на обещание. Часто, когда мы запрашиваем данные из других источников, таких как внешний API, мы не всегда знаем, когда наши данные будут возвращены.

Я думаю, что ваш пример имеет в виду что-то вроде этого:

function download(url, callback) {
    console.log(`Downloading ${url} ...`);
    fetch(url)
      .then((response) => {
          callback(null, response)
      })
      .catch((error) => {
         callback(err, null)
      });
}

download("http://example.com/movies.json", function(err, response){
    // Do something with the response data
});

Разве я не могу просто создать другую функцию и вызвать эту функцию из функции загрузки?

Было бы более разумно передать другую функцию в качестве обратного вызова, например:

function handleMovieData(err, response) {
    // Do something with the response data
}

download("http://example.com/movies.json", handleMovieData);

Комментарий Ника Парсонса объясняет это хорошо


РЕДАКТИРОВАТЬ : В качестве альтернативы функции обратного вызова можно использовать асинхронное / ожидание (не проверено)

async function download(url) {
    console.log(`Downloading ${url} ...`);
    return new Promise(function(resolve, reject) {
      fetch(url)
        .then((response) => {
            resolve(response)
        })
        .catch((error) => {
            reject(err)
        });
    })
}

const movieData = await download("http://example.com/movies.json");

handleMovieData(movieData);
...