Javascript 承诺是否仅适用于异步操作?

Javascript 承诺是否仅适用于异步操作?,javascript,promise,es6-promise,Javascript,Promise,Es6 Promise,我想知道我是否可以在倒计时的时候使用承诺。我的代码如下所示: function countdown(duration, callback) { ... } function sayHi() { console.log('hi'); } function countdown(duration) { return new Promise(function (resolve, reject) { // wait for duration and resolve

我想知道我是否可以在倒计时的时候使用承诺。我的代码如下所示:

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

function sayHi() {
  console.log('hi');
}
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);
我把它称为

countdown(15, sayHi);
有没有办法让我改成这样

countdown(15).then(sayHi); 

是我当前代码的一部分。

是的,承诺是隐藏回调的一种方式。例如,您可以使用以下承诺:

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

function sayHi() {
  console.log('hi');
}
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);

是的,承诺是隐藏回电的一种方式。例如,您可以使用以下承诺:

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

function sayHi() {
  console.log('hi');
}
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);
是的,您可以在自己的特定时间解决这些问题,如。使用闭包可以同时避免多个调用的错误响应

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


}

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

Javascript是单线程的。因此,如果调用函数,它必然会立即在同一线程上运行。promise是一种方便的方式,可以稍后在同一线程上运行代码,但作为不同事件处理程序的一部分

因此,在超时的情况下,当稍后应该调用回调时,使用承诺是一个好主意

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


更具可读性

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

Javascript是单线程的。因此,如果调用函数,它必然会立即在同一线程上运行。promise是一种方便的方式,可以稍后在同一线程上运行代码,但作为不同事件处理程序的一部分

因此,在超时的情况下,当稍后应该调用回调时,使用承诺是一个好主意

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



更具可读性

那将是一个异步操作,不是吗?谷歌关于承诺,然后你就能回答你的问题。真的吗?我的倒计时函数中的所有代码都是同步的,这就是它现在的样子。我基本上只是手动调用回调。承诺只用于异步操作吗?-对有没有办法让我倒计时呢;相反对让我们看看。。。是的,我们可能会帮助您进行转换。倒计时意味着异步性。我的坏消息是,这将是一个异步操作,不是吗?谷歌关于承诺,然后你就能回答你的问题。真的吗?我的倒计时函数中的所有代码都是同步的,这就是它现在的样子。我基本上只是手动调用回调。承诺只用于异步操作吗?-对有没有办法让我倒计时呢;相反对让我们看看。。。是的,我们可能会帮助您进行转换。倒计时意味着异步性。我的坏消息没有承诺。延迟函数。看看@Bergi这些不是ES6承诺。你链接的页面上的第二句话是一个弃用通知。是的,它已经过时了,我很久以前就用过了Thanks@ngLover倒计时返回TypeError:Promise resolver undefined不是一个函数没有Promise.defer函数。请查看@Bergi这些不是ES6承诺。你链接的页面上的第二句话是一个弃用通知。是的,它已经过时了,我很久以前就用过了Thanks@ngLover倒计时返回TypeError:Promise resolver undefined不是一个函数不是所有回调都可以使用promises隐藏。你有例子吗?不是将回调作为参数传递,而是转到then,不需要其他更改。实际上:-您的代码很好,我只是不同意语句的一般性承诺是隐藏回调的一种方式。啊,我明白了。我刚刚意识到,当一个回调被多次调用为sync或async时,一个承诺不容易实现?替换它。这就是管道/流在NodeJS中发挥作用的地方。有意思。没错——承诺永远不能用在这种情况下。它们只适用于只调用一次且通常是异步的回调。并不是所有回调都可以使用承诺隐藏。你有例子吗?不是将回调作为参数传递,而是转到then,不需要其他更改。实际上:-您的代码很好,我只是不同意语句的一般性承诺是隐藏回调的一种方式。啊,我明白了。我刚刚意识到,当一个回调被多次调用为sync或async时,一个承诺不容易实现?替换它。这就是管道/流在NodeJS中发挥作用的地方。有意思。没错——承诺永远不能用在这种情况下。它们只适用于只调用一次且通常是异步的回调
将其用作异步原语。在setInterval中像您那样使用console.log不会给您带来任何承诺的好处。@Bergi:承诺是为了倒数结束,就像OP的帖子中所说的那样。console.log模拟倒计时期间用户将执行的UI更新。我想我是按字面意思倒计时的。是的,但如果你在使用承诺,你也应该从承诺中更新UI:-为什么要重新发明setTimeout?承诺setTimeout并将其用作异步原语更合理。在setInterval中像您那样使用console.log不会给您带来任何承诺的好处。@Bergi:承诺是为了倒数结束,就像OP的帖子中所说的那样。console.log模拟倒计时期间用户将执行的UI更新。我想我是真的倒计时了。是的,但是如果你在使用Promissions,你也应该在Promissions中进行UI更新:-为什么要重新创建setTimeout?谢谢你的解释!给了你一票。还感谢您提供异步等待的链接,看起来很酷谢谢您的解释!给了你一票。还感谢您链接到AsyncWait,这看起来很酷