javascript函数完成
我有以下几行代码。问题是函数GetScore()需要一些时间才能完成(大约2秒)。我想做的是相应地设置分数标题。现在的问题是,执行到第3行,稍后某个时候在计算机上进行评分。我怎么能“等待”分数准备好,只执行第3行javascript函数完成,javascript,jquery,Javascript,Jquery,我有以下几行代码。问题是函数GetScore()需要一些时间才能完成(大约2秒)。我想做的是相应地设置分数标题。现在的问题是,执行到第3行,稍后某个时候在计算机上进行评分。我怎么能“等待”分数准备好,只执行第3行 $("#ScoreHeader").html('Calculating...'); score = GetScore(); $("#ScoreHeader").html('Done'); 任何想法都将受到欢迎。您可以尝试重构GetScore以获取回调函数 定义GetScore如下:
$("#ScoreHeader").html('Calculating...');
score = GetScore();
$("#ScoreHeader").html('Done');
任何想法都将受到欢迎。您可以尝试重构GetScore以获取回调函数 定义
GetScore
如下:
function GetScore(cb){
var score = ... // the score calculation logic
cb(score);
}
然后你就可以做了
$("#ScoreHeader").html('Calculating...');
var score;
GetScore(function(data){
score = data;
$("#ScoreHeader").html('Done');
});
您可以尝试重构GetScore以获取回调函数 定义
GetScore
如下:
function GetScore(cb){
var score = ... // the score calculation logic
cb(score);
}
然后你就可以做了
$("#ScoreHeader").html('Calculating...');
var score;
GetScore(function(data){
score = data;
$("#ScoreHeader").html('Done');
});
因为您使用的是jQuery,所以有一种非常有效的模式可以用来简化异步函数(通常是ajax)的接口 然后你可以做类似的事情
getScore().done(function (score) {
});
我强烈建议您阅读jQuery中的对象
编辑:如果您没有执行ajax请求,而是使用setTimeout
或setInterval
以异步方式处理数据,则仍然可以使用Deferred
对象
这里是,我们有一个函数,它异步求和值,并返回一个延迟的对象,该对象允许客户端代码有效地处理控制流
function sumValuesAsync(values) {
var deferred = arguments[1] || $.Deferred(),
i = arguments[2] || 0,
sum = arguments[3] || 0;
sum += values[i];
if (++i === values.length) {
deferred.resolve(sum); //notice observers that the process is completed
} else {
setTimeout(function () {
sumValuesAsync(values, deferred, i, sum);
}, 500);
}
return deferred;
}
sumValuesAsync([1, 1, 1, 1]).done(function (total) {
console.log(total);
});
因为您使用的是jQuery,所以有一种非常有效的模式可以用来简化异步函数(通常是ajax)的接口
然后你可以做类似的事情
getScore().done(function (score) {
});
我强烈建议您阅读jQuery中的对象
编辑:如果您没有执行ajax请求,而是使用setTimeout
或setInterval
以异步方式处理数据,则仍然可以使用Deferred
对象
这里是,我们有一个函数,它异步求和值,并返回一个延迟的对象,该对象允许客户端代码有效地处理控制流
function sumValuesAsync(values) {
var deferred = arguments[1] || $.Deferred(),
i = arguments[2] || 0,
sum = arguments[3] || 0;
sum += values[i];
if (++i === values.length) {
deferred.resolve(sum); //notice observers that the process is completed
} else {
setTimeout(function () {
sumValuesAsync(values, deferred, i, sum);
}, 500);
}
return deferred;
}
sumValuesAsync([1, 1, 1, 1]).done(function (total) {
console.log(total);
});
如果GetScore()
是一个非同步函数,它在完成之前不会停止执行(您的描述让它听起来像是这样),那么在完成之前您不能暂停javascript执行
您需要深入了解如何实现GetScore()
,并在GetScore()内部创建一个通知(回调),当它实际完成时将被调用。如果GetScore()
使用AJAX检索分数,那么核心AJAX实现将在实际完成时发出通知,您可以使用该通知触发自己的回调。如果GetScore()
是一个非同步函数,在完成之前不会停止执行(您的描述听起来像是这样的),然后,在javascript执行完成之前,不能暂停javascript执行
您需要深入了解如何实现GetScore()
,并在GetScore()内部创建一个通知(回调),当它实际完成时将被调用。如果GetScore()
使用AJAX检索分数,那么核心AJAX实现在实际完成时会有一个通知,您可以使用它来触发自己的回调。我没有做任何AJAX请求,只是一些需要更长时间的计算,所以我只是想知道如何使用AJAX代码?@user1144596,您的计算使用的是setTimeout或setInterval,对吗?基本上,GetScore计算画布对象上多个对象的位置,但它被编码为同步,然后我编写了执行和更新图像翻转计数器的代码。我想在屏幕上显示一些活动,而图像翻转计数器功能正在等待数据。我在GetScore中没有设置Timeout,但我可以用这种方式重新编码。deferred似乎很有趣,它会让你尝试一下,你可以发布GetScore
函数的实现吗,因为如果函数是同步的,那么代码会从上到下执行,它们是你编写示例时应该采用的方式。也许你没有给我们足够的信息来帮助你。我没有做任何ajax请求,只是一些需要更长时间的计算,所以我只是想知道如何使用ajax代码?@user1144596,你的计算使用的是setTimeout或setInterval,对吗?基本上,GetScore计算画布对象上多个对象的位置,但它被编码为同步,然后我编写了执行和更新图像翻转计数器的代码。我想在屏幕上显示一些活动,而图像翻转计数器功能正在等待数据。我在GetScore中没有设置Timeout,但我可以用这种方式重新编码。deferred似乎很有趣,它会让你尝试一下,你可以发布GetScore
函数的实现吗,因为如果函数是同步的,那么代码会从上到下执行,它们是你编写示例时应该采用的方式。也许您没有给我们足够的信息来帮助您。score=GetScore(…)
使用面向回调的异步API毫无意义。@plalx谢谢。更新后,我没有进行任何处理。score=GetScore(…)
对于面向回调的异步API毫无意义。@plalx谢谢。更新后,我没有进行处理。