1

我正在尝试使用函数的结果更新变量,以便可以在其他地方引用它,但它不会更新。

var total = 0;

mainQuery.count({
    success: function (number) {
        console.log("results",number);
        total = number;
    }
});

console.log("total is",total);

// console output:
// results 164
// total is 0

这样做的正确方法是什么?

4

5 回答 5

4

据我所知,您的mainQuery.count()函数是异步的,success一旦结束运行就会运行回调。但是,您console.log()在注册回调后调用,而不是在成功函数结束运行后调用。你应该做的是console.log()在成功回调之后运行:

var total = 0;

mainQuery.count({
    success: function (number) {
        console.log("results",number);
        total = number;
        myFn();
    }
});

function myFn() {
    console.log("total is",total);
}
于 2013-11-04T13:42:33.073 回答
4

正如@Blazemonger 所说,success可能是一个异步函数。的输出console.log("total is",total);可能在成功甚至分配total值之前呈现

于 2013-11-04T13:46:58.623 回答
1
var total = 0;

mainQuery.count({
    success: function (number) {
        console.log("results",number);
        total = number;
        console.log("total is",total);
    }
});

//The code you had here is executed before the async-call is done. So it hasnt updated total with the value yet.

// console output:
// results 164
// total is 0
于 2013-11-04T13:43:01.970 回答
1

这段代码应该以这种方式工作。结帐“关闭”这就是您正在做的事情。简而言之,闭包意味着您正在从另一个上下文中访问一个变量。

这基本上是一样的:

<script>
var test = 0;
setTimeout(function() { test = 10; }, 1000);
</script>

它有效。^^

您的问题可能是,在异步函数返回之前,您正在访问该变量

于 2013-11-04T13:39:55.293 回答
1

在不知道变量的整体范围的情况下total,很难回答,但要涵盖所有基础,您可以这样做......

window.total = 0;

mainQuery.count({
    success: function (number) {
        console.log("results",number);
        window.total = number;
    }
});

console.log("total is", window.total);
于 2013-11-04T13:40:23.493 回答