对asyncawait的理解

25次阅读

共计 943 个字符,预计需要花费 3 分钟才能阅读完成。

async 函数

先看看 MDN 上怎么介绍的:

async function 声明用于定义一个返回 AsyncFunction 对象的异步函数。异步函数是指通过事件循环异步执行的函数,它会通过一个隐式的 Promise 返回其结果。但是如果你的代码使用了异步函数,它的语法和结构会更像是标准的同步函数。

  • 如果 async 函数中是 return 一个值,这个值就是 Promise 对象中 resolve 的值;
  • 如果 async 函数中是 throw 一个值,这个值就是 Promise 对象中 reject 的值。

async 函数的写法

async function imAsync(num) {if (num > 0) {return num // 这里相当于 resolve(num)
  } else {throw num // 这里相当于 reject(num)
  }
}

imAsync(1).then(function (v) {console.log(v); // 1
});

// 注意这里是 catch
imAsync(0).catch(function (v) {console.log(v); // 0
})

Promise 的写法

function imPromise(num) {return new Promise(function (resolve, reject) {if (num > 0) {resolve(num);
    } else {reject(num);
    }
  })
}

imPromise(1).then(function (v) {console.log(v); // 1
})

imPromise(0).then(function (v) {console.log(v); // 0
})

await

await 会暂停当前 async 函数的执行,等待后面的 Promise 的计算结果返回以后再继续执行当前的 async 函数。

如果单纯的 await setTimeout(…) 是行不通的,await 不是什么都等,它等待的只是 Promise,你如果没有给他返回个 Promise,那它还是会继续向下执行。
所以 await 等待的不是所有的异步操作,等待的只是 Promise。

总结

async/await 是在 Promise 之后产生的,它和 Promise 诞生的目的都是为了解决“回调地狱”,至于什么是回调地狱:


Promise 改进后:


async/await 改进后:

正文完
 0