承诺仅用于异步操作吗?

时间:2015-11-25 06:56:10

标签: javascript promise es6-promise

我想知道我是否可以使用我的倒数计时器的承诺。我的代码看起来像这样:

function countdown(duration, callback) {
  ...
}

function sayHi() {
  console.log('hi');
}

我做了类似

之类的事情
countdown(15, sayHi);

有没有办法可以做到这一点?

countdown(15).then(sayHi); 

Here是我当前代码的JSFiddle。

4 个答案:

答案 0 :(得分:3)

是的,承诺是一种隐藏"回调。对于您的示例,您可以使用这样的承诺:

function countdown(duration) {
    return new Promise(function (resolve, reject) {
        // wait for duration and resolve
        setTimeout(function () {
            resolve();
        }, duration);
    });
}

function sayHi() {
    console.log('hi');
}

countdown(1000).then(sayHi);

答案 1 :(得分:2)

承诺适用于任何不一定立即运行的操作。

Javascript是单线程的。因此,如果调用函数,它必须立即在同一个线程上运行。承诺是一段时间后运行代码的便捷方式(仍然在同一个线程上,但作为不同事件处理程序的一部分)。

因此,在超时的情况下,当稍后调用回调时,使用promise是个好主意。

如果您不确定是使用承诺还是简单回调,那么两者的用途或多或少相同,但承诺通常会使代码更具可读性。

ES7 async-await更具可读性!

答案 2 :(得分:0)

是的,你可以在你自己的特定时间resolve使用它们。使用闭包来逃避同时多次通话的不良反应。

function countdown(duration, callback) {
 var deferred = Promise.defer();
    (function(duration,deferred){setTimeout(function(){
        deferred.resolve();
    },duration);
  })(duration,deferred);
}

上一个已经过时检查这一个。

  function countdown(duration, callback) {
     return new Promise(function (resolve, reject) {
            setTimeout(function () {
                resolve();
            }, duration);
        });


}

答案 3 :(得分:0)

function countdown(duration) {
  return new Promise(function(resolve, reject) {
    var interval = setInterval(function() {
      console.log(duration--);
      if (!duration) {
        clearInterval(interval);
        resolve();
      }
    }, 1000);
  });
}
countdown(15).then(function() { console.log("DONE"); });