我想知道我是否可以使用我的倒数计时器的承诺。我的代码看起来像这样:
function countdown(duration, callback) {
...
}
function sayHi() {
console.log('hi');
}
我做了类似
之类的事情countdown(15, sayHi);
有没有办法可以做到这一点?
countdown(15).then(sayHi);
Here是我当前代码的JSFiddle。
答案 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"); });