关于ES6 Promise的一个问题

发布于 2022-09-04 12:29:38 字数 491 浏览 31 评论 0

代码:

var p1 = new Promise(function (resolve, reject) {
    setTimeout(() => reject("123"), 3000)
})

var p2 = new Promise(function (resolve, reject) {
    setTimeout(() => resolve(p1), 1000)
})

p2
    .then(result => console.log("error01",result),
        result => console.log("error02",result))
    .catch(error => console.log("error2",error))

最后打出error02 123

并没有看懂p1和p2之间的变化逻辑,以及最后就怎么输出这个了,应该是我比较愚钝。

有没有懂的朋友能帮助讲解一下,十分感谢

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

微暖i 2022-09-11 12:29:38
var p1 = new Promise(function (resolve, reject) {
    setTimeout(() => reject("123"), 3000)
})

var p2 = new Promise(function (resolve, reject) {
    setTimeout(() => resolve(p1), 1000)
})

p2
    .then(result => console.log("error01",result),
        result => console.log("error02",result))
    .catch(error => console.log("error2",error))
  1. Promise.resolve(promise);当resolve方法中传入一个promise对象时,则返回的状态会采用传入promise对象的返回状态,也是就是说这里p2的状态会采用p1返回的状态。

  2. 因为p1中reject('123'),所以p2返回的状态自然为p1的reject('123'),即调用了.then中的第二个reject时候的回调函数即 result => console.log("error02",result)。

缱绻入梦 2022-09-11 12:29:38

Returns a Promise object that is resolved with the given value. If the
value is a thenable (i.e. has a then method), the returned promise
will "follow" that thenable, adopting its eventual state;
https://developer.mozilla.org...

resolve的参数如果是个promise的话,它会使用那个promise的结束状态作为自己的结束状态

野却迷人 2022-09-11 12:29:38

这里面主要有状态传递,即如果p2 resolve的是另一个Promise(p1)对象,则p2的状态由p1决定。

var p1 = new Promise(function(resolve, reject) {    
    setTimeout(() => reject("123"), 3000);            
});

var p2 = new Promise(function(resolve, reject) {
    setTimeout(() => resolve(p1), 1000);
    //0-1000,p1的状态为pending, p2的状态为pending;
    //1000s时,p2的要执行resolve,但是此时p1状态为peding,所以1000-3000会等待p1的状态改变
    //3000s时,p1变为reject,并且传递给p2,此时p2也变为reject
});

p2.then(result => console.log("error01", result),
    result => console.log("error02", result))
.catch(error => console.log("error3", error));
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文