網站首頁 編程語言 正文
Promise關鍵問題
文章目錄
- Promise關鍵問題
- 修改用戶的狀態
- 執行多個回調
- 改變狀態和指定回調的順序
- then方法返回結果特點
- promise串聯多個操作任務
- promise異常穿透
- 中斷promise鏈
修改用戶的狀態
如果沒有經過res(value)或者rej(value),當前狀態一般都是pedding
<script>
let p = new Promise((res,rej)=> {
//res('ok') // 成功情況下 把原來的pending => fulfilled(res)
//rej('err') // 失敗時 把pending => rejected
//拋出錯誤
throw '出問題'
})
console.log(p);
</script>
執行多個回調
promise指定多個成功/失敗的回調函數,當promise改變為對應狀態的時候調用
<script>
let p = new Promise((res, rej) => {
res('ok') //當pending => fulfilled(res),就可以執行以下回調,若不執行res,即pedding沒有改變,則無法進去回調
})
//指定回調1
p.then(val => {
console.log(val)
})
//指定回調2
p.then(val => {
alert(val)
})
</script>
改變狀態和指定回調的順序
同步任務下是先改變狀態后執行回調;異步任務下是先執行回調后改變狀態(下面代碼輸出ppp)
先改變狀態后執行回調方法
1、在執行器中直接調用res()/rej()
2、延長更長事件才調用then
得到數據的方法
不管先改變狀態還是后改變狀態,一定是通過res/rej來觸發then的回調
<script>
// 同步任務下是先改變狀態后執行回調;異步任務下是先執行回調后改變狀態
let p = new Promise((res, rej) => {
setTimeout(()=> {
res('ok')
},1000)
})
p.then(val => {
console.log('ppp')
})
</script>
then方法返回結果特點
promise.then()返回新promise的結果狀態由then()指定的回調函數執行的結果決定
<script>
// 同步任務下是先改變狀態后執行回調;異步任務下是先執行回調后改變狀態
let p = new Promise((res, rej) => {
// setTimeout(()=> {
res('ok')
// },1000)
})
let result=p.then(val => {
// console.log('ppp')
// 1 拋出問題
// throw '問題'
// 2、返回的結果是非promise對象
// return 555
// 3、返回的結果是promise對象
return new Promise((res, rej) => {
//res('success') //promise的值為success
rej('err') //promise的值為err
})
},reason=> {
console.warn(reason);
})
console.log(result);
</script>
promise串聯多個操作任務
promise.then()返回一個新的promise,可以開成then()鏈式調用
通過then()鏈式調用串聯多個同步/異步任務
<script>
let p = new Promise((res, rej) => {
setTimeout(()=> {
res('ok')
},1000)
})
p.then(val => {
return new Promise((res, rej) => { //如果沒有return默認返回undefined
res('success')
})
},reason=> {
console.warn(reason);
}).then(val => {
console.log(val); //獲取的結果是success
}).then(val => {
console.log(val); //獲取的結果是undefined
})
// (第一個then)p.then返回結果是Promise,而Promise狀態由他所指定的回調函數的返回值決定, 倒數第二個(then)中的promise回調沒有聲明返回值
</script>
promise異常穿透
在使用promise的then鏈式調用時,可以在最后指定失敗的回調
前面任何操作出了異常,可以在最后指定失敗的回調
<script>
let p = new Promise((res, rej) => {
setTimeout(()=> {
rej('不ok')
},1000)
})
p.then(val => {
console.log(111);
}).then(val => {
console.log(222);
}).then(val => {
console.log(333);
}).catch(err=> {
console.warn(err);
})
</script>
中斷promise鏈
在使用promise的鏈式調用時,在中間中斷,不再調用后面的回調函數
辦法:在回調函數中返回一個pedding狀態的promise對象
<script>
let p = new Promise((res, rej) => {
setTimeout(()=> {
res('不ok')
},1000)
})
p.then(val => {
console.log(111);
//想要中斷promise鏈,有且只有一個辦法,就是把狀態改回pedding,當狀態為pedding的時候就不會再執行then
return new Promise(()=> {} )
}).then(val => {
console.log(222);
}).then(val => {
console.log(333);
}).catch(err=> {
console.warn(err);
})
</script>
原文鏈接:https://blog.csdn.net/m0_63779088/article/details/126700726
- 上一篇:沒有了
- 下一篇:沒有了
相關推薦
- 2022-06-18 Elasticsearches通過坐標位置實現對附近人的搜索_其它綜合
- 2022-07-19 statfs函數使用
- 2023-10-11 小程序|頁面傳參的三種方式
- 2022-10-27 python使用pika庫調用rabbitmq交換機模式詳解_python
- 2022-07-21 python:實現balanced parentheses平衡括號表達式算法(附完整源碼)
- 2022-11-14 python中numpy?常用操作總結_python
- 2022-11-03 Python中的def?__init__(?)函數_python
- 2022-08-27 Oracle縮表空間的完整解決實例_oracle
- 欄目分類
-
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支