百度前端学院看到一段话:
异步JavaScript和XML这不是一个全新的技术,而是利用已有的js/css/xml等技术达到前端数据及时更新的效果.对用户而言,前端页面的刷新就是点击页面刷新按钮
或者F5实现页面内容的刷新。甚至有很多人不知道页面刷新这个概念……
页面刷新的目的是让页面从新从服务器获取数据,通常是在页面长时间未更新数据,至于多长时间算长,没有定论,几分钟、半小时、n小时都可以说是长时间。例如,门户网站的新闻列表,可能1个小时之内,服务器后台已增加了很多条新的新闻,前端可以通过刷新,从新获取最新的新闻展示在页面上。
再如,网页文字直播NBA篮球比赛,可能后台服务器每几秒就会有一条新的动态,需要用户连续刷新页面内容来获取最新动态。以上的刷新方法是用户手动对整个页面内容进行刷新,针对以上的需求,明显是不合理的,AJAX就是实现了自动更新需要刷新的数据的效果。其基本思路是前端js与后台不断通讯,及时获取前端某部分数据的变化信息,及时进行自动数据获取更新,使用户无需刷新网页即可保持页面数据最新的状态。例如,球赛文字直播、股票实时信息等。
关于异步JavaScript说的太好了。补充一下,异步的主要目的在于,异步函数直接返回,不阻塞页面其他模块的加载,等到该部分加载完毕后调用回调函数刷新页面的该部分内容。不断通讯是怎么实现的?定时调用回调函数?
我想不通,听说async和promise就是解决这个问题的,于是进行查询。
后来又问了专业人员,人家跟我解释是用socket,跟这个没半毛钱关系。。。服了
- 回调函数
downloadPhoto('http://coolcats.com/cat.gif', handlePhoto)
function handlePhoto (error, photo) {
if (error) console.error('Download error!', error);//2
else console.log('Download finished', photo);//2
}
console.log('Download started')//1
handlePhoto就是回调函数,在downloadPhoto完毕后handlePhoto才被调用,程序先输出1,后输出2。回调函数与普通函数的差别在于其执行顺序不是自顶向下,而是取决于函数完成顺序。
- 回调地狱
异步函数中,一个数据的展示需要另一个数据,这就导致函数作为参数层层嵌套。
fs.readdir(source, function (err, files) {
if (err) {
console.log('Error finding files: ' + err)
} else {
files.forEach(function (filename, fileIndex) {
console.log(filename)
gm(source + filename).size(function (err, values) {
if (err) {
console.log('Error identifying file size: ' + err)
} else {
console.log(filename + ' : ' + values)
aspect = (values.width / values.height)
widths.forEach(function (width, widthIndex) {
height = Math.round(width / aspect)
console.log('resizing ' + filename + 'to ' + height + 'x' + height)
this.resize(width, height).write(dest + 'w' + width + '_' + filename, function(err) {
if (err) console.log('Error writing file: ' + err)
})
}.bind(this))
}
})
})
}
})
看到最后的金字塔形状和所有})?这就是被称为回调地狱,嵌套层数太多。解决方案,给匿名函数起名字;模块化;使得代码简短;
- Promise,async/await解决回调地狱
Promises:是编写异步代码的一种方式,它仍然以自顶向下的方式执行,并且由于鼓励使用try / catch样式错误处理而处理更多类型的错误
https://www.cnblogs.com/fanghl/p/9497533.html
这里讲的很清楚,先mark再看