Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript函数完成_Javascript_Jquery - Fatal编程技术网

javascript函数完成

javascript函数完成,javascript,jquery,Javascript,Jquery,我有以下几行代码。问题是函数GetScore()需要一些时间才能完成(大约2秒)。我想做的是相应地设置分数标题。现在的问题是,执行到第3行,稍后某个时候在计算机上进行评分。我怎么能“等待”分数准备好,只执行第3行 $("#ScoreHeader").html('Calculating...'); score = GetScore(); $("#ScoreHeader").html('Done'); 任何想法都将受到欢迎。您可以尝试重构GetScore以获取回调函数 定义GetScore如下:

我有以下几行代码。问题是函数GetScore()需要一些时间才能完成(大约2秒)。我想做的是相应地设置分数标题。现在的问题是,执行到第3行,稍后某个时候在计算机上进行评分。我怎么能“等待”分数准备好,只执行第3行

$("#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谢谢。更新后,我没有进行处理。