对于 JS Promise,我们需要知道些什么

Promise迷你书 & Promise (MDN)

将这个两个材料列出来,可能已经够了

下面列几个要点


创建建一个 Promise 对象

1
new Promise( function(resolve, reject) {...} /* executor */  )

resolvereject 函数被调用时,分别将 promise 的状态改为 fulfilled(完成)rejected(失败)

使用的时候,把异步操作放入这个「承诺」里(返回一个 Promsie 对象):

1
2
3
4
5
6
7
8
9
10
function myAsyncFunction(url) {
// 新建一个 promise 对象
return new Promise((resolve, reject) => {
const xhr = new XMLHttpRequest()
xhr.open("GET", url)
xhr.onload = () => resolve(xhr.responseText) // 调用 resolve 的时候,这个 promise 对象变为「完成」状态
xhr.onerror = () => reject(xhr.statusText) // 调用 reject 的时候,这个 promise 对象变为「失败」状态
xhr.send()
})
}

当我们想知道「承诺」的结果时,可以使用 promise.then() 实例方法

1
promise.then(onFulfilled, onRejected)
  • resolve (成功) 时, onFulfilled 会被调用
  • reject (失败) 时, onRejected 会被调用

如果只想对异常进行处理,可以采用:

1
promise.catch(onRejected)

一个完整的例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function asyncFunction() {

return new Promise(function (resolve, reject) {
setTimeout(function () {
resolve('Async Hello world')
}, 16)
})
}

asyncFunction().then(function (value) {
console.log(value) // => 'Async Hello world'
}).catch(function (error) {
console.log(error)
})

Promise.resolve

静态方法 Promise.resolve(value) 可以认为是 new Promise() 方法的快捷方式

比如 Promise.resolve(42) 可以认为是以下代码的语法糖:

1
2
3
new Promise(function(resolve){
resolve(42)
})

Promise.reject(error) 也是类似的


Promise.prototype.then()

上面我们已经看到过 .then 的使用,它最多需要两个参数,分别是处理「成功」状态和「失败」状态的回调函数

promise chain

.then().catch() 都会返回一个 Promise 对象,所以可以链式调用

then 的返回

如果传入的 onFulfilled 参数类型不是函数,则会在内部被替换为(x) => x ,即原样返回 promise 最终结果的函数

也就是说 p1(一个 Promise 对象)走到了 then 但没找到相应的处理函数,则直接返回一个带着 p1 终态的 Promise 对象。

如果 then 里有处理函数 h1,那这个 then 返回值就要看 h1 返回的是什么了

  • 如果then中的回调函数返回一个值,那么then返回的Promise将会成为接受状态,并且将返回的值作为接受状态的回调函数的参数值。
  • 如果then中的回调函数抛出一个错误,那么then返回的Promise将会成为拒绝状态,并且将抛出的错误作为拒绝状态的回调函数的参数值。
  • 如果then中的回调函数返回一个已经是接受状态的Promise,那么then返回的Promise也会成为接受状态,并且将那个Promise的接受状态的回调函数的参数值作为该被返回的Promise的接受状态回调函数的参数值。
  • 如果then中的回调函数返回一个已经是拒绝状态的Promise,那么then返回的Promise也会成为拒绝状态,并且将那个Promise的拒绝状态的回调函数的参数值作为该被返回的Promise的拒绝状态回调函数的参数值。
  • 如果then中的回调函数返回一个未定状态(pending)的Promise,那么then返回Promise的状态也是未定的,并且它的终态与那个Promise的终态相同;同时,它变为终态时调用的回调函数参数与那个Promise变为终态时的回调函数的参数是相同的。

原文作者: dgb8901,yinxing

原文链接: https://www.itwork.club/2018/11/15/Promise/

版权声明: 转载请注明出处

为您推荐

体验小程序「简易记账」

关注公众号「特想学英语」

极简 Session & Token