目录
Promise是异步编程的一种解决方案,主要用来解决地狱回调的问题,可以有效的减少回调嵌套。通俗讲,Promise是一个许诺、承诺。是对未来事情的承诺,承诺不一定能完成,但是无论是否能完成都会有一个结果。
真正解决需要配合async/await。
-
- function doDelay(time) {
- // 1. 创建 promise 对象(pending 状态), 指定执行器函数
- return new Promise((resolve, reject) => {
- // 2. 在执行器函数中启动异步任务
- console.log('启动异步任务')
- setTimeout(() => {
- console.log('延迟任务开始执行...')
- const time = Date.now() // 假设: 时间为奇数代表成功, 为偶数代表失败
- if (time % 2 === 1) { // 成功了
- // 3. 1. 如果成功了, 调用 resolve()并传入成功的 value
- resolve('成功的数据 ' + time)
- } else { // 失败了
- // 3.2. 如果失败了, 调用 reject()并传入失败的 reason
- reject('失败的数据 ' + time)
- }
- }, time)
- })
- }
- const promise = doDelay(2000)
- promise.then(// promise 指定成功或失败的回调函数来获取成功的 vlaue 或失败的 reason
- value => {// 成功的回调函数 onResolved, 得到成功的 vlaue
- console.log('成功的 value: ', value)
- },
- reason => { // 失败的回调函数 onRejected, 得到失败的 reason
- console.log('失败的 reason: ', reason)
- },
- )
-
-
- function sendAjax(url){
- return new Promise((resolve,reject)=>{
- const xhr = new XMLHttpRequest();
- xhr.open('GET',url);
- xhr.send();
- xhr.onreadystatechange = ()=>{
- if(xhr.readyState == 4){
- if(xhr.status >= 200 && xhr.status < 300){
- const data = JSON.parse(xhr.response)
- if(data.code == 200){
- resolve(data.lists)
- }else{
- reject('失败')
- }
- }
- }
- }
- })
- }
-
- const MyPromise = sendAjax('http://127.0.0.1:5500/9.12%20%E7%8E%8B%E4%BB%95%E4%B8%B9/test.json')
- MyPromise.then((resolve)=>{
- console.log(resolve)
- })
-
async是一个加在函数前的修饰符,被async定义的函数会默认返回一个Promise对象resolve的值。因此对async函数可以直接then,返回值就是then方法传入的函数。
-
- async function myfun(){
- // 1.非promise对象
- return 'succ'
- }
- const MyPromise = myfun()
- console.log(MyPromise)
- MyPromise.then((resolve)=>{
- console.log(resolve)
- })
-

我们可以看到,当我们return的是一个非promise对象时,返回的是 promise对象。
-
- async function myfun(){
- // 1.非promise对象
- // return 'succ'
- // 2.promise对象
- return new Promise((resolve,reject)=>{
- reject("error");
- })
- }
- const MyPromise = myfun()
- console.log(MyPromise)
- MyPromise.then((resolve)=>{
- console.log(resolve)
- })
-

return的是promise对象,返回的promise对象与内部一致。
await 也是一个修饰符,只能放在async定义的函数内。可以理解为等待。
await 修饰的如果是Promise对象:可以获取Promise中返回的内容(resolve或reject的参数),且取到值后语句才会往下执行;
如果不是Promise对象:把这个非promise的东西当做await表达式的结果。
- async function demo(){
- try{
- const a = 1;
- const b = await new Promise((resolve,reject)=>{
- setTimeout(()=>{
- console.log("promise执行了...");
- resolve("succ");//成的值
- },3000)
- })
- const c = 3;
- console.log(a,b,c);
- }catch(e){
- console.log(e);
- }
- }
-
- const MyPromise = demo();

async作为一个关键字放在函数前面,表示该函数是一个异步函数,异步函数意味着该函数的执行不会阻塞后面代码的执行;而 await 用于等待一个异步方法执行完成;
async/await的作用就是使异步操作以同步的方式去执行。