- Objective: - Breadcrumb: # 概念阐释 ## 语义 在[[JavaScript 异步编程]]中,Promise对象会返回一个异步操作所处的状态,表示完成或失败。 异步方法并不像同步方法那样立刻返回值,而是**返回一个`promise`对象**,以便在未来告诉我们这个操作是完成了还是失败了。  `Promise` 有三种状态: - 待定(pending):初始状态,既没有被兑现,也没有被拒绝。 - `resolve`:将pending的状态改为已兑现(fulfilled),意味着操作成功完成。 - `rejected`:将pending状态改为已拒绝(rejected),意味着操作失败。 如果一个 Promise 已经被兑现或拒绝,即不再处于待定状态,那么则称之为已**敲定(settled)**。 ![](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise/promises.png) ## 语法 ### 构造函数 ```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); ``` ![](http://image.harryrou.wiki/2023-08-16-CleanShot%202023-08-16%20at%2014.01.44%402x.png) # 参考资料 - [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)