• JavaScript是一个单线程的语言。以往进行http请求都是请求-等待返回-下一个请求...而异步请求则是请求完后不等待返回直接下一个请求,返回由服务端主动返回,接收其他请求结构不影响当前请求发起
    • Promise是为了解决请求多层嵌套时回调的问题,将成功,异常,错误等回调进行封装。axios就充分利用了Promise的特性。见下面

    • Promise 是一个构造函数,使用 new Promise 创建实例。所以变量 p 引用的是创建出来的一个对象。
    • Promise 构造函数有一个参数 executor ,它是一个函数,在 Promise 创建实例的过程中就会被立即执行执行
    • executor 函数有两个参数 resolvereject ,也都是函数。在 executor 执行的过程中,会触发 resolve、reject 的执行(以上例子中为异步执行)。
      • 当 resolve 函数被执行时,当前的 Promise 对象将变成 fulfilled 状态。
      • 当 reject 函数被执行时,当前的 Promise 对象将变成 rejected 状态。
    • Promise 对象一但变成 fulfilled 状态或者 rejected 状态之后,它的两个回调(中的某一个)函数将会被放入微队列,未来将会被主线程取出执行。

      • 当 Promise 对象变成 fulfilled 状态,它的 then 回调将被放入微队列(而 catch 回调将会被忽略)。then 回调被传入的参数,就是当初被传入 resolve 函数的参数。
      • 当 Promise 对象变成 rejected 状态,它的 catch 回调将被放入微队列(而 then 回调将会被忽略)。catch 回调被传入的参数,就是当初被传入 reject 函数的参数。 ```javascript /**
        • 同步调用实例 */ let p = new Promise((resolve, reject) => { // 做一些事情,根据你自己的逻辑来。通常是异步逻辑。

      // 根据上面代码的执行结果,可能调用 resolve,也可能调用 reject if (/ 条件随便写 ^_^ 根据你自己的逻辑来 /) { resolve(); // 一旦它被执行,则意味着 Promise 对象进入成功状态。 } else { reject(); // 一旦它被执行,则意味着 Promise 对象进入失败状态。 } });

    p.then(() => { // 执行 Promise 的成功回调 }, () => { // 执行 Promise 的失败回调 })

    /* p.then(函数一, 函数二);

    也可以写成:

    p.then(函数一) .catch(函数二); */

    1. ```javascript
    2. import Vue from 'vue'
    3. export default {
    4. async function ajax(params) {
    5. return new Promise((resolve, reject) => {
    6. $.ajax({
    7. url: params && params.url || '',
    8. type: params && params.type || 'post',
    9. contentType: params && params.contentType || 'application/x-www-form-urlencoded',
    10. data: params && params.data || '',
    11. success: function (res) { resolve(res); },
    12. error: function (res) { reject(res); }
    13. });
    14. });
    15. }
    16. }
    17. //测试
    18. ajax({
    19. url: '/departments',
    20. type: "get",
    21. }).then((res) => {
    22. console.log(res);
    23. }).catch((res) => {
    24. console.log(res);
    25. });