为什么将全局变量设置为节点js中的回调函数内的值,在控制台中返回undefined?

时间:2012-09-02 15:36:05

标签: node.js callback

以此为例

var s;
cb = function(error,result){
s = result;
}
memcached.get('hellow',cb);
console.log(s);

这给了我undefined。我的代码出了什么问题?

3 个答案:

答案 0 :(得分:1)

console.log(s);行在cb函数执行之前执行,因为cbmemcached.get可用之前不会result调用{{1}}。这是node.js中任何I / O操作发生的经典异步性。

答案 1 :(得分:1)

您需要在定义console.log后执行s,因为它是异步的:

var s;
cb = function(error,result){
    s = result;
    console.log(s);
}
memcached.get('hellow',cb);

答案 2 :(得分:1)

变量 s 正在回调函数中初始化。只有当memcached.get()完成获取'hellow'的数据时,才会触发此回调函数。

Javascript依赖于事件循环机制。这意味着javascript运行时将继续执行脚本,直到它到达结尾而不会阻止任何回调发生。

在您的示例中,javascript运行时将在行 memcached.get('hellow',cb)之后立即执行 console.log(s)没有阻止。因此,只有在 cb 在最后一行之前执行时,您案例中的console.log才会打印有效值(未定义除外)。

请在回调函数中移动 console.log(s)行以获得更一致的结果。