Javascript-回调与从另一个函数中调用函数

Javascript-回调与从另一个函数中调用函数,javascript,asynchronous,callback,Javascript,Asynchronous,Callback,我有以下代码: function download(url, callback) { setTimeout(() => { // script to download the picture here console.log(`Downloading ${url} ...`); callback(); }, 3* 1000); } download(url); 为什么我需要一个回调函数。我不能创建另一个函数并从下载函数中调用该函数

我有以下代码:

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

      callback();

   }, 3* 1000);
}


download(url);

为什么我需要一个回调函数。我不能创建另一个函数并从下载函数中调用该函数吗?我不认为人们说异步编程需要回调有什么意义。

当值取决于承诺的响应时,回调是必要的。通常,当我们从其他来源(如外部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/await(未测试)


如果您没有回调函数,那么当您调用
download()
时,函数将立即调用您的函数,而不是等待3秒钟来调用它。这里的回调并不代表下载过程的开始,而是下载过程的结束。因此,一旦下载完成(需要花费x个时间),您的回调就会被调用。这里使用setTimeout来模拟下载过程,该过程需要花费x个时间量。然后,回调中的代码可以访问执行下载时检索到的数据,例如下载的内容谢谢您的回答,但是:console.log在3秒后调用,为什么不在3秒后调用普通方法(而不是回调)?halfer,如果这回答了您的问题,考虑一下这个问题,这样我就可以自我感觉良好了。谢谢英雄联盟
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);