Javascript 在使用随机超时完成多个函数后,如何运行语句?
我得到了这个密码:Javascript 在使用随机超时完成多个函数后,如何运行语句?,javascript,asynchronous,Javascript,Asynchronous,我得到了这个密码: 'use strict'; var total = 0; console.log("Start of program - total is now: " + total); setTimeout(function() { console.log("function 1"); total += 10; }, 500); setTimeout(function() { console.log("function 2"); total +=
'use strict';
var total = 0;
console.log("Start of program - total is now: " + total);
setTimeout(function() {
console.log("function 1");
total += 10;
}, 500);
setTimeout(function() {
console.log("function 2");
total += 50;
}, Math.floor(Math.random() * 1000));
setTimeout(function() {
console.log("function 3");
total += 100;
}, Math.floor(Math.random() * 1000));
console.log("End of progam - total is now: " + total);
只有在执行上面的所有超时时,我如何运行最后一个console.log?有几种可能的方法来解决这个问题。如果您有时间的话,我建议您仔细研究一下承诺,并使用Promise.all() 但是,如果您坚持只使用普通回调,我将用以下内容替换console.log:
var countTimeoutsFinished = 0;
function testEndOfProgram() {
if(countTimeoutsFinished === 3) {
console.log("End of program - total is now: " + total);
}
}
然后,在每个超时内,递增countTimeoutsFinished并调用TestEndofProgramm():
。当第三次超时完成时,countTimeoutsFinished将为3,当您进入testEndOfProgram时,console.log将执行。有几种可能的方法来解决此问题。如果您有时间的话,我建议您仔细研究一下承诺,并使用Promise.all() 但是,如果您坚持只使用普通回调,我将用以下内容替换console.log:
var countTimeoutsFinished = 0;
function testEndOfProgram() {
if(countTimeoutsFinished === 3) {
console.log("End of program - total is now: " + total);
}
}
然后,在每个超时内,递增countTimeoutsFinished并调用TestEndofProgramm():
。当第三次超时完成时,countTimeoutsFinished将为3,当您进入testEndOfProgram时,console.log将执行。您可以使用承诺,正如Kyle所说 使用jQuery运行示例(为了简化,您可以使用任何Promise库) var合计=0
console.log("Start of program - total is now: " + total);
var dfd1 = new jQuery.Deferred();
setTimeout(function() {
console.log("function 1");
total += 10;
dfd1.resolve();
}, 500);
var dfd2 = new jQuery.Deferred();
setTimeout(function() {
console.log("function 2");
total += 50;
dfd2.resolve();
}, Math.floor(Math.random() * 1000));
var dfd3 = new jQuery.Deferred();
setTimeout(function() {
console.log("function 3");
total += 100;
dfd3.resolve();
}, Math.floor(Math.random() * 1000));
$.when.apply($, [dfd1, dfd2, dfd3])
.done(function() {
alert("End of progam - total is now: " + total);
});
小提琴:正如凯尔所说,你可以使用承诺 使用jQuery运行示例(为了简化,您可以使用任何Promise库) var合计=0
console.log("Start of program - total is now: " + total);
var dfd1 = new jQuery.Deferred();
setTimeout(function() {
console.log("function 1");
total += 10;
dfd1.resolve();
}, 500);
var dfd2 = new jQuery.Deferred();
setTimeout(function() {
console.log("function 2");
total += 50;
dfd2.resolve();
}, Math.floor(Math.random() * 1000));
var dfd3 = new jQuery.Deferred();
setTimeout(function() {
console.log("function 3");
total += 100;
dfd3.resolve();
}, Math.floor(Math.random() * 1000));
$.when.apply($, [dfd1, dfd2, dfd3])
.done(function() {
alert("End of progam - total is now: " + total);
});
Fiddle:检查对象,如果您需要更好的支持,可以使用我可能不会使用API唯一的纯Javascript,谢谢您提供的信息。Promise是纯javascript,虽然还没有得到广泛的支持。没有promises,就无法真正了解超时功能是否完成。我想您可以创建一个数组,并在函数完成后添加到其中。然后使用
setInterval
轮询,直到该数组已满。这只是一个想法。看看object,如果你需要更好的支持,你可以使用我可能不会使用API唯一的纯Javascript,谢谢你提供的信息。Promise是纯javascript,虽然还没有得到广泛的支持。没有promises,就无法真正了解超时功能是否完成。我想您可以创建一个数组,并在函数完成后添加到其中。然后使用setInterval
轮询,直到该数组已满。这只是一个想法。我有一个类似的想法,只是我想在setInterval
中调用testEndOfProgram
。这是一个更好的主意:-)我有一个类似的想法,只是我想在setInterval
中调用testEndOfProgram
。这是一个更好的主意:-)我感谢您抽出时间回答我,我不能使用库,因为我需要使用纯Javascript。但当我可以使用Jquery时,我会记住这一点。谢谢有一些Promise的纯库,如Q、when等。。。你可以看看:而且,承诺开始在浏览器中得到本机支持,所以很快你就不需要一个库来使用它们了!感谢您抽出时间回答我的问题,我不能使用库,因为我需要使用纯Javascript。但当我可以使用Jquery时,我会记住这一点。谢谢有一些Promise的纯库,如Q、when等。。。你可以看看:而且,承诺开始在浏览器中得到本机支持,所以很快你就不需要一个库来使用它们了!