百度前端学院看到一段话:

异步JavaScript和XML这不是一个全新的技术,而是利用已有的js/css/xml等技术达到前端数据及时更新的效果.对用户而言,前端页面的刷新就是点击页面刷新按钮
或者F5实现页面内容的刷新。甚至有很多人不知道页面刷新这个概念……
页面刷新的目的是让页面从新从服务器获取数据,通常是在页面长时间未更新数据,至于多长时间算长,没有定论,几分钟、半小时、n小时都可以说是长时间。例如,门户网站的新闻列表,可能1个小时之内,服务器后台已增加了很多条新的新闻,前端可以通过刷新,从新获取最新的新闻展示在页面上。
再如,网页文字直播NBA篮球比赛,可能后台服务器每几秒就会有一条新的动态,需要用户连续刷新页面内容来获取最新动态。以上的刷新方法是用户手动对整个页面内容进行刷新,针对以上的需求,明显是不合理的,AJAX就是实现了自动更新需要刷新的数据的效果。其基本思路是前端js与后台不断通讯,及时获取前端某部分数据的变化信息,及时进行自动数据获取更新,使用户无需刷新网页即可保持页面数据最新的状态。例如,球赛文字直播、股票实时信息等。

关于异步JavaScript说的太好了。补充一下,异步的主要目的在于,异步函数直接返回,不阻塞页面其他模块的加载,等到该部分加载完毕后调用回调函数刷新页面的该部分内容。不断通讯是怎么实现的?定时调用回调函数?
我想不通,听说async和promise就是解决这个问题的,于是进行查询。
后来又问了专业人员,人家跟我解释是用socket,跟这个没半毛钱关系。。。服了

  1. 回调函数
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。回调函数与普通函数的差别在于其执行顺序不是自顶向下,而是取决于函数完成顺序。

  1. 回调地狱
    异步函数中,一个数据的展示需要另一个数据,这就导致函数作为参数层层嵌套。
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))

        }

      })

    })

  }

})

看到最后的金字塔形状和所有})?这就是被称为回调地狱,嵌套层数太多。解决方案,给匿名函数起名字;模块化;使得代码简短;

  1. Promise,async/await解决回调地狱

Promises:是编写异步代码的一种方式,它仍然以自顶向下的方式执行,并且由于鼓励使用try / catch样式错误处理而处理更多类型的错误
https://www.cnblogs.com/fanghl/p/9497533.html
这里讲的很清楚,先mark再看