美文网首页
Promise 的串联

Promise 的串联

作者: bestCindy | 来源:发表于2020-08-12 21:41 被阅读0次

当后续的 Promise 需要用到之前的 Promise 的处理结果时,需要 Promise 的串联

Promise 对象中,无论是 then 方法还是 catch 方法,它们都具有返回值,返回的是一个全新的 Promise 对象,它的状态满足下面的规则:

1、如果当前的 Promise 是未决的,得到的新的 Promise 是挂起状态
2、如果当前的 Promise 是已决的,会运行响应的后续处理函数,并将后续处理函数的结果(返回值)作为 resolved 状态数据,应用到新的 Promise 中;如果后续处理函数发生错误,则把返回值作为 rejected 状态数据,应用到新的 Promise 中

后续的 Promise 一定会等到前面的 Promise 有了后续处理结果,才会变成已决状态
后续 Promise 的状态数据是前面 Promise 的结果

const pro1 = new Promise((resolve, reject) => {
      resolve(1);
});
console.log(pro1);

const pro2 = pro1.then(result => {
     return result * 2
});
console.log(pro2);
  • fulfilled 就是 resolve
  • 为什么 pro1 是 resolve 状态,因为 new Promise 那里是同步代码,resolve 也是同步执行的,所以当执行到输出 pro 那里时,pro1 已经是 resolve 状态
  • 为什么 pro2 是 pending 状态,因为当 pro1 有了后续处理结果,也就是执行完 then 后面的语句,pro2 才会变成 resolve 状态,但是 then 里面的内容是异步执行的,也就是先输出 pro2 在执行 then 里面的内容,所以当输出 pro2 的时候,pro2 还处于 pending 状态

如果前面的 Promise 的后续处理,返回的是一个 Promise,则返回的新的 Promise 状态和后续处理返回的 Promise 状态保持一致

const pro1 = new Promise((resolve, reject) => {
    resolve(1);
});

const pro2 = new Promise((resolve, reject) => {
    setTimeout(() => {
        resolve(2);
    }, 3000);
});

const pro3 = pro1.then(result => {
    console.log("success");
    return pro2;
});

pro3.then(result => {
     console.log(result);
});
  • 先输出 “success”, 然后 3 秒之后输出 2
  • 因为 pro2 是一个 promise, 所以 pro3 的状态要和 pro2 保持一致,当 pro2 的状态变成 resolve 的时候,pro3 的状态才能变成 resolve

上面代码也可以这样写

const pro1 = new Promise((resolve, reject) => {
    resolve(1);
});

const pro2 = new Promise((resolve, reject) => {
    setTimeout(() => {
         resolve(2);
    }, 3000);
});

pro1.then(result => {
    console.log("结果出来了,得到的是一个 Promise");
    return pro2;
}).then(result => {
    console.log(result);
});

一个例子

//ajax 返回的是一个 Promise 对象
const pro = ajax({
    url: "./data/students.json"
});

pro.then(resp => {
    for (let i = 0; i < resp.length; i++) {
        if (resp[i].name == "李华") {
            return resp[i].classId;
        }
    }
}).then(cid => {
    const pro1 = ajax({
        url: "./data/classes.json?cid=" + cid
    });
    const pro2 = pro1.then(cls => {
        for (let i = 0; i < cls.length; i++) {
            if (cls[i].id == cid) {
                return cls[i].teacherId;
            };
        };
    });
    return pro2;
}).then(tid => {
    console.log("老师的id:" + tid);
    return ajax({
        url: "./data/teachers.json"
    }).then(ts => {
        for (let i = 0; i < ts.length; i++) {
            if (ts[i].id == tid) {
                return ts[i];
            };
        };
    })
}).then(teacher => {
    console.log(teacher);
});

相关文章

网友评论

      本文标题:Promise 的串联

      本文链接:https://www.haomeiwen.com/subject/igtudktx.html