使用promise从函数延迟返回

时间:2016-11-10 15:47:44

标签: javascript promise es6-promise

我想运行以下功能: 如果条件得到解决 1)添加课程 2)睡4秒然后删除课程 3)然后使用return停止运行功能。

    function sleep(time) {
    return new Promise(resolve => {
        setTimeout(resolve, time)
    })
  }
    function playGame() {
    if (counter === 3) {
        Promise.resolve().then(function () {
            message.classList.add('winner');
            sleep(2500).then(function () {
                message.classList.remove('winner');
            });
        });
        return;
      }
    ...
   }

如果我运行此代码,函数当然会立即返回。如何将回报添加到承诺链。

1 个答案:

答案 0 :(得分:1)

这应该有效:

Promise.resolve()
.then(function () {
    message.classList.add('winner');
})
.then(sleep(2500))
.then(function() {
    message.classList.remove('winner');
});

这应该是不言自明的。随意根据需要提出更多问题。

编辑:Oooops似乎我太快回答了这个问题。你永远不能推迟javascript中的“return”语句。在您的情况下,您的代码或我的代码立即执行,并且立即调用封闭函数的return,并且执行返回到事件循环。 然后,调用promise的第一个 then()等等......

由于你不能推迟函数的返回,你可以使用回调或更好的Promises来链接事件:

function playGame() {
    return Promise.resolve()  // note the return !
    .then(function () {
        message.classList.add('winner');
    })
    .then(sleep(2500))
    .then(function() {
        message.classList.remove('winner');
    });
}

...then

playGame()
.then(function() {
    // this code is called after playGame's Promise has been executed
});

// this code is called when playGame ends, ie immediately, and before any promises code

换句话说:一旦你开始拥有异步代码(通过回调或承诺),每个进一步的代码也需要由promises驱动。