承诺仅适用于异步操作吗?

Are promises only for async operations?

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

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

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

我通过类似

的方式来调用它
countdown(15, sayHi);

有什么办法可以代替吗?

countdown(15).then(sayHi); 

Here 是我当前代码的 JSFiddle。

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

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);

是的,您可以 resolve 在您自己的特定时间关闭它们 like.use 以避免同时发生多个调用的不良响应。

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);
        });


}
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"); });

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

Javascript 是单线程的。所以如果你调用一个函数,它必然会立即在同一个线程上 运行 。 promise 是稍后 运行 编码的便捷方式(仍然在同一个线程上,但作为不同事件处理程序的一部分)。

所以在超时的情况下,稍后应该调用回调时,使用 promise 是个好主意。

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

ES7 async-await 更具可读性!