iT邦幫忙

2021 iThome 鐵人賽

DAY 28
1
Modern Web

追求JS小姊姊30天系列 第 28

追求JS小姊姊系列 Day28 -- 工具人給不完的Promise,`妳`都不要

前情提要:

簡單介紹了很厲害的青梅竹馬

工具人們:所以說人帥又強真好啊....你有看過昨天吵很兇的網路文章嗎?
:什麼文章?
工具人們:就是一篇叫什麼渣男給不完的promise,那算什麼啊,有沒有想過我們工具人的心情?以為我們自願當工具人?


resolvereject,自己決定

工具人們:在變成工具人前,我其實也會看事情拒絕reject的,像是那種劈頭就獅子大開口的..

const deny = new Promise((resolve,reject)=>{
    console.log("你聽過...(?)")
    reject("我ok,你先聽");
})
deny;

仔細看會發現有幾個不懂的值,簡單說明:

  1. [[PromiseState]]:回傳Promise狀態
  2. [[PromiseResult]]:根據reject或是resolve回傳對應的值

工具人們:當你覺得一件事合理可以做時,像是要是有人約你去他家看貓時,合理嘛當然會resolve

const okDESU = new Promise((resolve,reject)=>{
    console.log("要來看我家貓後空翻嗎?");
    resolve("真的嗎?好啊好啊")
})

:那你們是怎麼淪落到今天的啊... 都看過貓了(?)
工具人們:何止呢?我們給過的Promise可不只這樣..


那些年,他們給過各種的Promise

誰告白不重要,只要有人先告白 Promise.race

阿物件:我先講講我的故事好了,是這樣的,回想我年輕時,那時候認識了三個女生,我甚至還記得她們的名字:sophia,alanna,ray

溫馨提醒:名字僅隨意取自網路資料,請勿對號入座。
function sophia() {
  return new Promise((resolve, reject) => {
    setTimeout(
      () => {
      
      resolve("sophia:跟我交往好嗎!")},
      (Math.random() + 1) * 1000
    );
  });
}

function alanna() {
  return new Promise((resolve, reject) => {
    setTimeout(
      () => {
      
      resolve("alanna說:跟我交往好嗎!")},
      (Math.random() + 1) * 1000
    );
  });
}

function ray() {
  return new Promise((resolve, reject) => {
    setTimeout(
      () =>{
      
      resolve("ray說:跟我交往好嗎!")},
      1000
    );
  });
}
Promise.race([sophia(), alanna(), ray()]).then((isWho) => {console.log(isWho)});

阿物件:因為很渴望交到女朋友,來擺脫魔法師的稱號,所以誰先跟我告白就接受。

最後,看似要脫魯了,結果...
那天Ray說:希望讓她再考慮一下,之後就突然聯絡不上了。

Promise.race

公式:Promise.race(iterable)
輸入值:可迭代值(iterable) ex: string,array
回傳情境:當promise內任一個rejectresolve完成時
回傳值:

  1. 當輸入值不是promise時,回傳一個fulfilledpromise,值為第一個不是promise的值
  2. Promise物件時,回傳狀態pending的物件:
    a. 皆為resolverace內容執行完成,最先執行完的值會執行then
    b. 任一值為reject,仍會 將race內容都執行完成,但並不會執行then

天生的專情工具命 Promise.all,Promise.allSettled

方函式:頭等工具人...指的不只是能力,同時也是一種態度,不然其實我也是很夯的,想當初...

function sophia(){
    return new Promise((resolve,reject)=>{
        setTimeout(()=>{
        console.log("sophia:跟我交往好嗎!")
        resolve("sophia:跟我交往好嗎!")},(Math.random()+1)*1000)
    })
}

function alanna(){
    return new Promise((resolve,reject)=>{
        setTimeout(()=>{
        console.log("alanna說:跟我交往好嗎!")
        resolve("alanna說:跟我交往好嗎!")},(Math.random()+1)*1000)
    })
}

function ray(){
    return new Promise((resolve,reject)=>{
        setTimeout(()=>{
        console.log("ray說:跟我交往好嗎!")
        resolve("ray說:跟我交往好嗎!")},(Math.random()+1)*1000)
    })
}
Promise.all([sophia(),alanna(),ray()]).then((isWho)=>console.log("我拒絕"))


方函式一次三個女生都跟我告白後,接著我全部都拒絕了,因為我愛的人只有JS。

Promise.all

公式:Promise.all(iterable)
輸入值:可迭代值(iterable) ex: string,array
回傳情境:當全部promiseresolve時,或一個reject
回傳值:

  1. 當輸入值不是promise時,回傳一個fulfilledpromise,值為第一個非promise
  2. Promise物件時,回傳狀態pending的物件:
    a. 皆為resolve:將all內容都執行完成,會執行then
    b. 任一為reject,將all內容都執行完成,但並不會執行then

兩者差異
根據MDN是這樣說的:

In comparison, the Promise returned by Promise.all() may be more appropriate if the tasks are dependent on each other / if you'd like to immediately reject upon any of them rejecting

Promise.all,Promise.allSettled的差別為,如果有rejectall會立刻回傳。

-- to be continued --


那今天就到這邊摟!
每天的休息,是為了後面的追求,明天見。


reference:

008
MDN
好聽道地「女生英文名字」大全!這樣取一秒給人好印象,不怕被笑俗


上一篇
追求JS小姊姊系列 Day27 -- 從哪裡BOM出來的青梅竹馬!
下一篇
追求JS小姊姊系列 Day29 -- 方函式的能力展現:最後型態`async`
系列文
追求JS小姊姊30天30

1 則留言

1
juck30808
iT邦新手 3 級 ‧ 2021-10-14 12:32:00

恭喜即將邁入完賽階段~

感謝你,也恭喜要完賽了/images/emoticon/emoticon08.gif

我要留言

立即登入留言