- Objective:
- Breadcrumb:
# 概念阐释
## 语义
在[[JavaScript 异步编程]]中,Promise对象会返回一个异步操作所处的状态,表示完成或失败。
异步方法并不像同步方法那样立刻返回值,而是**返回一个`promise`对象**,以便在未来告诉我们这个操作是完成了还是失败了。
`Promise` 有三种状态:
- 待定(pending):初始状态,既没有被兑现,也没有被拒绝。
- `resolve`:将pending的状态改为已兑现(fulfilled),意味着操作成功完成。
- `rejected`:将pending状态改为已拒绝(rejected),意味着操作失败。
如果一个 Promise 已经被兑现或拒绝,即不再处于待定状态,那么则称之为已**敲定(settled)**。

## 语法
### 构造函数
```js
const executorFunction = (resolve,reject) => { };
const myFirstPromise = new Promise(executorFunction);
// 写在一起
const myFisrtPromise = new Promise((resolve,reject)=>{ });
```
- resolve 和reject是2个函数,分别表示Promise成功时的回调和发生错误时的回调
# 实例
Promise就像是一个**承诺**,告诉你:“等这个操作完成,无论成功或失败(的**状态**),我都会通知你。”
```js
const myFirstPromise = new Promise((resolve, reject) => {
// 当异步操作成功时,我们调用 resolve(...),当其失败时,调用 reject(...)。
// 在这个例子中,我们使用 setTimeout(...) 来模拟异步代码。
// 在实际情况中,你可能会使用类似 XHR 或 HTML API 等。
setTimeout(() => {
resolve("成功!"); // 耶!一切顺利!
}, 250);
});
myFirstPromise.then((successMessage) => {
// successMessage 是我们在上面的 resolve(...) 函数中传入的任何内容。
// 它不一定是字符串,但如果它只是一个成功的消息,那么它大概率是字符串。
console.log(`耶!${successMessage}`);
});
```
# 相关内容
早期JavaScript处理异步的方法,如[[回调函数]]。早期的异步HTTP请求(AJAX)使用XMLHttpRequest,这些并不涉及Promise。
## 证明Promise是一个对象
```js
const asyncHello = new Promise((resolve, reject) => {
setTimeout(resolve, 1000, 'Hello!');
});
console.log(typeof asyncHello);
```
# 问题
```js
const inventory = {
sunglasses: 1900,
pants: 1088,
bags: 1344
};
```
写一个promise对象:
- 当太阳镜数量大于0时,状态为解决,返回“有库存”
- 否则为拒绝,返回售罄
- 创建一个新的promise并在终端中返回结果
- *为什么要多写一步函数?* 确实冗余,但如果较复杂还是封装起来好
# 问题答案
```js
const inventory = {
sunglasses: 1900,
pants: 1088,
bags: 1344
};
// Write your code below:
const myExecutor = (resolve,reject) => {
if(inventory.sunglasses > 0){
resolve('Sunglasses order processed.');
}else{
reject('That item is sold out.');
}
};
const orderSunglasses = () => {
return new Promise(myExecutor);
};
let orderPromise = orderSunglasses();
console.log(orderPromise);
```

# 参考资料
- [Promise-MDN](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise#%E6%9E%84%E9%80%A0%E5%87%BD%E6%95%B0)
- [使用Promise](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Using_promises)
- [GPT](https://chat.openai.com/share/cba6935d-7392-45c8-8c7f-802661906f58)