如何兑现承诺

时间:2018-12-25 11:39:24

标签: javascript promise

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

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

2 个答案:

答案 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(...)