首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何连锁承诺

如何连锁承诺
EN

Stack Overflow用户
提问于 2018-12-25 11:39:24
回答 2查看 62关注 0票数 0

在这个简化的示例中,当第一个承诺得到解决时,我将调用三个函数。

代码语言:javascript
复制
var test = new Promise(function (res, err) { setTimeout(res, 3000) })

test.then( () => { console.log("A") });
test.then( () => { 
    return new Promise(function(res, err) { 
        setTimeout(()=> { console.log("C"); 
        res() }, 3000) 
    }); 
});

test.then( () => { console.log("B") });

预期的输出是A B C

让我们假设,只有当第二个承诺得到解决时,我才想调用第三个.then来控制台B

如果我试图将第二个承诺(myProm)存储在全局中并在其上附加一个.then函数,我将(合理地)获得一个TypeError,因为在编译时myProm仍未定义。

代码语言:javascript
复制
var test = new Promise(function (res, err) { setTimeout(res, 3000) })
var myProm;

test.then( () => { console.log("A") });
test.then( () => { 
    myProm = new Promise(function(res, err) { 
        setTimeout(()=> { console.log("C"); 
        res() }, 3000) 
    })
    return myProm;
});

myProm.then( () => { console.log("B") });

我该怎么做?将两个承诺链接在一起的最佳方式是什么,以便在我们执行下一个.then之前,需要解析来自一个then的返回承诺obj。

在这个场景中,我想要的输出是A C B

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-12-25 11:43:57

每次调用.then时,都会创建一个新的Promise,当该.then返回的Promise解析时,该.then就会解析。应该将myProm-containing .then的结果分配给一个变量,然后对该变量调用.then

代码语言:javascript
复制
var test = new Promise(function (res, err) { setTimeout(res, 500) })
var myProm;

test.then( () => { console.log("A") })
  .then( () => { 
      myProm = new Promise(function(res, err) { 
          setTimeout(()=> { console.log("C"); 
          res() }, 500) 
      })
      return myProm;
  })
  .then( () => { console.log("B") });

在大多数情况下,当使用Promises时,您应该像这样链接.then。只有当您想在prom.then(...) ... prom.then(...)解析时初始化两个完全独立的异步操作时才执行prom

票数 1
EN

Stack Overflow用户

发布于 2018-12-25 11:45:51

then返回一个承诺,在指定的函数运行并且它返回的值已经解析时解决这个问题(这稍微简化了一些,但是对于这里的任务来说已经足够了)。

因此,要根据then的结果连锁一个承诺。只需点击另一个.then

代码语言:javascript
复制
var test = new Promise(function (res, err) { setTimeout(res, 3000) })

test.then( () => { console.log("A") });
test
    .then( () => { 
        return new Promise(function(res, err) { 
            setTimeout(()=> { console.log("C"); res() }, 3000);
        });
    })
    .then( () => { console.log("B") });

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53922023

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档