JS中 所有代码都是 单线程执行的 这个缺陷 导致 js的所有网络操作,浏览器事件,都必须是异步执行的.

异步执行 可以用回调函数实现

function callback() {
    console.log('Done');
}
console.log('before setTimeout()');
setTimeout(callback, 1000); // 1秒钟后调用callback函数
console.log('after setTimeout()');

会发现 在console 的最下面,等待一秒 会多出个done.

可见 异步操作 会在将来某个时间触发一个函数.

AJAX 就是典型的异步操作. request.onreadystatechange = function () { if (request.readyState === 4) { if (request.status === 200) { return success(request.responseText); } else { return fail(request.status); } } }

把回调函数: success(request.responseText)和fail(request.status) 写到一个 AJAX操作里面很正常, 但是不好看.且不利于代码复用.

更好的写法: var ajax = ajaxGet(‘http://…’); ajax.ifSuccess(success) .ifFail(fail);

这种写法的好处: 先执行AJAX逻辑. 不关心处理结果. 然后根据结果是成功还是失败, 在将来某个时候调用 success 或 fail函数.

这个比之前的好处就是. 之前的写法 必须等待结果. 这个等待需要时间. 这段时间内不能执行别的操作. 之后的这种写法的好处是. 发起请求. 不管成功失败反正会有内容返回回来的. 先执行别的操作… 用到结果的时候再来判断.

“君子一诺千金”,这种“承诺将来会执行”的对象在JavaScript中称为Promise对象。

可见Promise最大的好处是在异步执行的流程中,把执行代码和处理结果的代码清晰地分离了: