Promise知識點

卡卡的筆錄發表於2020-03-19

1.Promise.then()預設返回一個Promise,理論上可以無限制的then,只不過如果後面所有的then中的回撥函式如果沒有返回新的Promise.resolve(data)的話,那麼它預設會生成一個Promise.resolve(undefined),或者如果then的回撥函式只返回了一個非Promise物件的話,那麼它也會預設生成Promise.resolve(非Promise物件)。
(1)情況1:未返回任何值(返回undefined)

function 獲取使用者資訊() {
   return Promise.resolve('姓名方方')
}
function 列印使用者資訊(使用者資訊) {
  console.log("使用者資訊", 使用者資訊);
  // return Promise.resolve(使用者資訊)
}
獲取使用者資訊()
.then(列印使用者資訊)
.then(列印使用者資訊);

上述程式碼列印結果為:
在這裡插入圖片描述
(2)情況2:返回一個非Promise物件的值

function 獲取使用者資訊() {
   return Promise.resolve('姓名方方')
}
function 列印使用者資訊(使用者資訊) {
	console.log("使用者資訊", 使用者資訊);
	return 11
}
獲取使用者資訊()
.then(列印使用者資訊)
.then(列印使用者資訊);

上述程式碼返回結果為:
在這裡插入圖片描述
以上兩種情況都理論上可以無限制的then下去。

2.await一個Promise,如果Promise中執行的是resolve(data),那麼返回值就是resolve(data)中的data;如果Promise中執行的是reject(error),那麼可以通過try catch來catch到reject(error)中的error。
(1) Promise中執行的是resolve情況

async function fooResolve1() {
    let data = await new Promise((resolve, reject) => {
        resolve(11)
    })
    console.log('data--->', data)
}
async function fooResolve2() {
    let data = await Promise.resolve(11)
    console.log('data--->', data)
}
fooResolve1()
fooResolve2()

上述兩種resolve情況返回的都是11
在這裡插入圖片描述
(2) Prromise中執行的是reject情況

async function fooReject1() {
   try {
       let data = await new Promise((resolve, reject) => {
           reject(11)
       })
       console.log("fooReject -> data", data)
   } catch (e) {
       console.log(e)
   }
}
async function fooReject2() {
   try {
       let data = await Promise. reject(11)
       console.log("fooReject -> data", data)
   } catch (e) {
       console.log(e)
   }
}
fooReject1();
fooReject2()

返回結果為:
在這裡插入圖片描述