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);