https://es6.ruanyifeng.com/#docs/promise
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise
```
let?a?=?new?Promise((res,?rej)?=>?{
????res('ok');
}).then(res?=>?{
????console.log(res,?'then1');
}).then(res?=>?{
????console.log(res,?'then2');
????throw?Error;
}).then(res?=>?{
????console.log(res,?'then3');
}).finally(()?=>?{
????console.log('finally1');
}).catch(err?=>?{
????console.log(err,?'catch1');
????return?err;
}).then(res?=>?{
????console.log(res,?'then4');
????return?'4321';
}).finally(()?=>?{
????console.log('finally2');
}).catch(err?=>?{
????console.log(err,?'catch2');
}).then(res?=>?{
????console.log(res,?'then5');
});
```
```
Promise.resolve("foobar")
//?1.?接收?"foo"?并與?"bar"?拼接,并將其結果做為下一個?resolve?返回。
??.then(function(string)?{
returnnewPromise(function(resolve,?reject)?{
setTimeout(function()?{
console.log('-------------------------')
string?+=?'bar';
resolve(string);
??????},?1);
????});
??})
//?2.?接收?"foobar",?放入一個異步函數中處理該字符串
//?并將其打印到控制臺中,?但是不將處理后的字符串返回到下一個。
??.then(function(string)?{
console.log('\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*')
setTimeout(function()?{
string?+=?'baz';
console.log(string);
????},?1)
returnstring;
??})
//?3.?打印本節中代碼將如何運行的幫助消息,
//?字符串實際上是由上一個回調函數之前的那塊異步代碼處理的。
??.then(function(string)?{
console.log(string);
console.log("Last?Then:??oops...?didn't?bother?to?instantiate?and?return?"?+
"a?promise?in?the?prior?then?so?the?sequence?may?be?a?bit?"?+
"surprising");
//?注意?`string`?這時不會存在?'baz'。
//?因為這是發生在我們通過setTimeout模擬的異步函數中。
console.log(string);
console.log(333);
??});
```
## Promise 的含義
Promise 是異步編程的一種解決方案,比傳統的解決方案——回調函數和事件——更合理和更強大。它由社區最早提出和實現,ES6 將其寫進了語言標準,統一了用法,原生提供了`Promise`對象。
所謂`Promise`,簡單說就是一個容器,里面保存著某個未來才會結束的事件(通常是一個異步操作)的結果。從語法上說,Promise 是一個對象,從它可以獲取異步操作的消息。Promise 提供統一的 API,各種異步操作都可以用同樣的方法進行處理。
`Promise`對象有以下兩個特點。
(1)對象的狀態不受外界影響。`Promise`對象代表一個異步操作,有三種狀態:`pending`(進行中)、`fulfilled`(已成功)和`rejected`(已失敗)。**只有異步操作的結果,可以決定當前是哪一種狀態,任何其他操作都無法改變這個狀態。這也是`Promise`這個名字的由來,它的英語意思就是“承諾”,表示其他手段無法改變**。
(2)一旦狀態改變,就不會再變,任何時候都可以得到這個結果。`Promise`對象的狀態改變,只有兩種可能:從`pending`變為`fulfilled`和從`pending`變為`rejected`。只要這兩種情況發生,狀態就凝固了,不會再變了,會一直保持這個結果,這時就稱為 resolved(**已定型**)。如果改變已經發生了,你再對`Promise`對象添加回調函數,也會立即得到這個結果。這與事件(Event)完全不同,事件的特點是,如果你錯過了它,再去監聽,是得不到結果的。
注意,為了行文方便,本章后面的`resolved`統一只指`fulfilled`狀態,不包含`rejected`狀態。
有了`Promise`對象,就可以將異步操作以同步操作的流程表達出來,避免了層層嵌套的回調函數。此外,`Promise`對象提供統一的接口,使得控制異步操作更加容易。
`Promise`也有一些缺點。首先,無法取消`Promise`,一旦新建它就會立即執行,無法中途取消。其次,如果不設置回調函數,`Promise`內部拋出的錯誤,不會反應到外部。第三,當處于`pending`狀態時,無法得知目前進展到哪一個階段(剛剛開始還是即將完成)。
如果某些事件不斷地反復發生,一般來說,使用[Stream](https://nodejs.org/api/stream.html)模式是比部署`Promise`更好的選擇。
- 空白目錄
- containerd
- php
- php常用函數
- 點語法
- 依賴注入
- 反射
- 迭代器和yield
- array_walk
- str_replace
- openssl_decrypt
- array_merge
- 閉包
- 深拷貝與淺拷貝
- 面向對象
- 魔術方法
- __invoke
- __isset 和 __unset
- __clone
- 常用知識點
- 訪問權限
- 抽象類
- 多態
- php框架
- tp
- tp3
- tp5
- job
- laravel
- 中間件
- laravel閉包
- symfony
- 小工具
- phpexcel
- xlswrite
- 設計模式
- 事件event
- 里氏替換原則
- 借鑒
- RESTful API
- 環境安裝
- 編譯安裝
- 編譯安裝后擴展補充
- php小記錄
- php-fpm
- 容器(Container)
- composer
- composer踩坑
- mysql
- 基礎知識
- 外鍵
- 索引
- 觸發器
- 定時器
- 分表
- 分區
- 連接查詢
- 事務
- 鎖機制
- 視圖
- 存儲過程
- 查詢
- 字符截取
- 批量修改表名(前綴)
- explain
- when_case
- pdo
- mysql優化
- 主從復制
- 權限分配
- 實用例子
- 查詢用戶
- 常見問題
- 5.7group by問題
- 遠程鏈接慢問題
- 查看進程
- 遠程訪問
- 常用小記
- mysqldump
- 備份還原
- 系統盤遷移數據盤
- 安裝sql
- 安裝MariaDB
- docker
- 安裝docker
- 配置centos開發環境
- docker運行程序
- rabbitmq
- 刪除無用鏡像
- 解決Centos firewalld導致的docker容器內無法訪問外網,無法訪問其他容器(host沒辦法解析)
- docker-compose
- docker-selenium
- ports 配置
- docker-compose-settings
- 安裝
- docker-compose常用配置
- docker常用命令
- build
- docker-hub加速
- docker-run
- Dockerfile
- apt-get update 無法升級
- 阿里打標簽
- 打包流程
- docker-network
- ufw 允許 docker 容器聯網
- 安裝containerd
- linux
- centos7
- 常用語法
- chmod
- chown
- find
- grep
- /etc/passwd
- chattr
- In軟連接
- 文件目錄大小
- xargs
- 管道用法
- top
- free
- 端口占用
- 壓縮解壓
- tar
- gzip
- zip
- 2>&1
- 環境變量
- 服務管理
- systemctl
- sed
- shell腳本
- time
- journal
- history
- linux-set
- linux-curl
- cp
- umask
- mkdir
- http狀態碼
- awk
- lsof
- crontab
- supervisor
- 常用命令匯總
- 用戶權限
- 普通用戶添加sudo權限
- sudo su
- 添加用戶
- 查看用戶信息
- 修改用戶信息
- 特殊權限
- 系統命令
- 常用小技巧
- vim小技巧
- 防火墻
- 常用規則
- iptables
- 磁盤清理
- 分區掛載
- linux-sh
- tmux
- 多命令執行
- 常用工具
- telnet
- ip轉發
- nohup
- watch
- dig
- 查看磁盤IO
- ssh
- 修改ssh端口
- ssh免密登錄
- 配置文件
- 公鑰分發
- xsync
- 國內鏡像站
- github加速
- 測網速
- 網卡
- 清理日志備份
- 配置sftp
- shell
- rpm
- 安全
- 安裝openssl
- 安裝openssh
- 禁用selinux和防火墻
- lanp環境安裝
- versionTool
- git
- git基本用法
- Gogs搭建
- git鉤子
- git的習慣配置
- phpStorm設置git bash
- git bash 設置代理
- gitignore 不起作用的解決辦法
- gitea搭建
- 同步主干到fork
- git修改地址
- svn
- svn基本操作
- svn 鉤子應用
- svn多版本操作
- Go語言
- Go語言基礎
- 安裝環境
- linux安裝
- window安裝
- 工具使用教程
- linux終端分屏Screen
- keepass 帳號密碼管理
- phpstorm
- 去掉window換行符
- php_cs
- 自定義快捷模塊
- phpstorm快捷鍵
- curl
- 正則
- 設計架構
- 設計模式的六大原則
- 計算機基礎
- TCP三次握手
- OSI7層
- http狀態返回碼
- 前端框架
- Vue
- Angular
- React
- node
- 服務端渲染(SSR)
- MVVM
- nuxt
- pm2
- js
- Promise
- es6
- 常用站點
- 工具類
- 學習類
- ps常用命令
- nginx
- 緩存
- 配置
- TCP
- 常用配置
- ng優先級
- vhost注意點
- nginx第一層驗證
- 轉發(跨域問題)
- 404
- nginx日志格式化
- 重啟腳本
- 寶塔禁用境外ip訪問
- ng統計
- ng編譯安裝
- 防盜鏈
- 技術相關了解
- ddos
- xss
- mysql防注入
- csrf攻擊
- 郵箱系統原理
- DNS
- python
- Selenium
- 微信
- 公眾號
- 公眾號配置
- 用戶授權
- 小程序
- 公有云
- 華為云
- JAVA
- springboot
- windows
- service
- WSL
- 目錄遷移
- wsl2 踩坑
- NoSql
- mongodb
- 安裝mongodb
- redis
- redis-windows
- redis-linux
- openstack
- ====副業====
- 擼茅臺
- 網絡
- 單位換算
- DB
- clickhouse
- mac