JS-异步编程机制

callback

xhr

fetch

Promise 期约

Promise 三种状态 待定 完成 拒绝 的变化 待定 => 完成 待定 => 拒绝 不可逆转,一旦确定,忽略后续更改和更改后对应的操作。

Promise.then 是一个微任务,可以链式执行,也可以多次执行

Promise.then 接受两个可选函数参数 onResolved onRejected, 其他类型参数忽略但向下传递状态返回值。

Promise 的方法 resolve reject all race finally catch 内部实现都用到了 then, 所以这些全部也都是微任务。

Promise 的异步异常(resolve(throw 0))只能使用异步方法(catch)捕获,而且拒绝状态必须被捕获。

Promise all 和 race 的功能和使用场景

  • Promise.all(iterable)

    1. 它接受一个 iterable 类型作为参数。
    2. 参数里面的值可以是 Promise 对象,也可以是其它值,只有 Promise 会等待状态改变。
    3. 当所有的子 Promise 都完成,该 Promise 完成,返回值是全部值的数组。
    4. 如果有任何一个失败,该 Promise 失败,返回值是第一个失败的子 Promise 的结果。
    5. 可用于顺序请求,组合请求
  • Promise.race(iterable)

    1. 它接受一个 iterable 类型作为参数。
    2. 参数里面的值可以是 Promise 对象,也可以是其它值,只有 Promise 会等待状态改变。
    3. 方法返回一个 promise,一旦迭代器中的某个 promise 解决或拒绝,返回的 promise 就会解决或拒绝。
    4. 可用于设置请求超时时间

async/await 异步

async 会将函数包装起来,当函数返回时,会将不是 Promise 的值包装成成一个新的 Promise 对象并返回。

await 只会解开 完成状态的 Promise.resolve() 返回值,会将不是 Promise 的值包装成成一个 Promise.resolve() 返回值再返回。

await 一定是异步的,所以会在等待期间将后续代码挂起不执行,等到完成状态,再执行后续代码。

setTimeout

setInterval

MutationObserver

setImmediate

Object.observe

process.nextTick