追求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
好听道地「女生英文名字」大全!这样取一秒给人好印象,不怕被笑俗


<<:  Day#28 上传照片(2)+Debug

>>:  29 | WordPress 区块编辑器 | 本次教学单元总结:

[神经机器翻译理论与实作] 从头建立英中文翻译器 (III)

前言 今天的内容依旧为训练翻译 seq2seq 神经网络的历程( training process ...

Oracle 1Z0-082 Practice Exam 2021

**Actual Oracle 1Z0-082 Practice Exam - Easiest Wa...

<Day22>用Shioaji API模拟帐户做台股下单

● 这章会示范如何用Shioaji做台股下单 终於来到下单的环节啦~~~ 没有下单过,别说你进入过股...

进击的软件工程师之路-软件战斗营 第十二周

学习进度 资料结构 Stack Queue Android Studio Activity(Life...

国外便宜独服收集

此文仅收集便宜的独立服务器,排名不分先后,不定期更新,有不对的或想投稿的请在在评论区评论 Onepr...