在这个简化的示例中,当第一个承诺得到解决时,我将调用三个函数。
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
。
如果我尝试将第二个Promise(myProm
)存储在全局变量中并在其上附加一个.then
函数,我将(合理地)收到一个TypeError,因为在编译时myProm仍未定义。
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") });
我该如何进行?将两个Promise链接在一起的最佳方法是什么,以便从一个.then
返回的Promise obj需要先解析,然后才能执行下一个then
。
在这种情况下,我想要的输出将是A C B
答案 0 :(得分:2)
then
返回一个promise,当指定的函数运行并且返回的值已解析时,promise就会解决(这有点过分简化,但足以完成此处的任务)。
因此,要在then
的结果上链接承诺。只需加上另一个.then
:
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") });
答案 1 :(得分:1)
每次调用.then
时,都会创建一个 new Promise
,当该Promise
返回的.then
解析时,该解析就会解决。您应该将包含myProm
的{{1}}的结果分配给一个变量,然后对该变量调用.then
:
.then
大部分时间在使用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(...)
。