回调是个什么鬼?

1.什么是回调?

首先必定要搞清楚回调的英文名 —— callback
什么是callback?回电话ajax

假如你如今去一个商店买橘子,结果没有橘子了
店员说,如今供货不稳定,不知道啥时候才能有橘子

let 商店
function 进货橘子() {
    setTimeout(() => {
        商店.orange = 10
    }, Math.random() * 10000)
}
进货橘子()

而后,你和店员说,这样吧,留个电话号码给你,橘子一到货,你就回个电话给我
function 你的电话号码() {
    console.log(arguments[0])
    console.log('好的,我立刻来')
}

店员说,行呀,那我把您的电话号码登记好
function 进货橘子(顾客电话号码) {
    setTimeout(() => {
        商店.orange = 10
        顾客电话号码().call(undefined,'橘子到啦,您快来买把')
    }, Math.random() * 10000)
}

咱们整理一下segmentfault

let 商店
function 进货橘子(顾客电话号码) {
    setTimeout(() => {
        商店.orange = 10
        顾客电话号码().call(undefined,'橘子到啦,您快来买把')
    }, Math.random() * 10000)
}

function 你的电话号码() {
    console.log(arguments[0])
    console.log('好的,我立刻来')
}

进货橘子(你的电话号码)
  1. 你留的电话号码就是回调函数
  2. 这个函数存在的意义就是可以有人通知你
  3. 通知你的行为就是触发回调函数

2.常见的回调形式

2.1 Node.js 的 error-first 形式

先判断error是否存在,存在则说明出现了错误,不存在则成功dom

fs.readFile('./1.txt', (error, content) => {
    if (error) {
        // 失败
    } else {
        // 成功
    }
})

2.2 jQuery 的 success / error 形式

$.ajax({
    url: '/xxx',
    success: () => {
    },
    error: () => {
    }
})

2.3 jQuery 的 done / fail / always 形式

$.ajax({
    url: '/xxx',
}).done(() => {
}).fail(() => {
}).always(() => {
})

2.4 Prosmise 的 then 形式

详情请见浅析Promise
全部异步操做返回一个带有属性then的对象异步

$.ajax({
    url: '/xxx',
}).then(() => {
}, () => {
}).then(() => {
})