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等。。。你可以看看:而且,承诺开始在浏览器中得到本机支持,所以很快你就不需要一个库来使用它们了!