2011-02-15 64 views
3

更新代碼:我,我是新來的Javascript編程和獲取未定義的變量,當試圖從一個方法分配一個新的變量。獲取未定義的變量在Javascript中

我正在使用node.js並在「客戶端變量」中使用redis-client創建redis服務器。

var redis = require("redis"); 
var client = redis.createClient(); 

client.on("error", function (err) { 
console.log("Error " + err); }); 

var numberPosts; 

client.get("global:nextPostId", function(err, replies) { 
    numberPosts = replies; 
    console.log(numberPosts); 
}); 

console.log(numberPosts); 

當我撥打電話內的console.log回調函數返回正確的值,但是當我打電話的console.log它返回「未定義」回調函數之外。我試圖將回調函數中的值賦給全局變量numberPosts。

任何幫助非常感謝,謝謝。

馬特

+0

當VAR numberPosts = client.get( 「全球:nextPostId」,redis.print);執行 會導致未定義。 – Matikus1trillion 2011-02-15 13:49:35

+0

你根本就不能這樣做。查看我的答案瞭解更多詳情。 – 2011-02-15 14:26:41

回答

4

我相信這將工作:

client.get("global:nextPostId", function (err, reply) { 
    console.log("Number of posts: " + reply.toString()); 
}) 

的AJAX調用是異步的,因此不會有回報值..而不是你必須使用回調函數,只有你有服務器方法返回的值。

編輯:分配返回值全局變量,首先聲明全局變量:

var _numOfPosts = ""; 

然後:

client.get("global:nextPostId", function (err, reply) { 
    _numOfPosts = reply.toString()); 
}) 

然而,該值將無法使用,直到AJAX調用完成以便您的原始代碼無法工作。沒有直接的回報價值來存儲。

您可以將計時器設置爲一些合理的響應時間,然後讓代碼使用全局變量。

編輯II:爲了調用再一次的完成方法,有這樣的代碼:

var _nextPostCallCount = 0; 
function GetNextPost() { 
    //debug 
    console.log("GetNextPost called already " + _nextPostCallCount + " times"); 

    //sanity check: 
    if (_nextPostCallCount > 1000) { 
     console.log("too many times, aborting"); 
     return; 
    } 

    //invoke method: 
    client.get("global:nextPostId", function(err, replies) { 
     numberPosts = parseInt(replies.toString(), 10); 
     console.log("num of replies #" + (_nextPostCallCount + 1) + ": " + numberPosts); 

     //stop condition here.... for example if replies are 0 
     if (!isNaN(numberPosts) && numberPosts > 0) 
     GetNextPost(); 
    }); 

    //add to counter: 
    _nextPostCallCount++; 
} 
GetNextPost(); 

這將遍地調用該方法,直到結果爲0,或者你通過一些硬編碼的限制防止無盡的循環。

0

試試這個,看看錯誤:

var redis = require("redis"); 

client = redis.createClient(); 

client.on("error", function (err) { 
console.log("Error " + err); }); 

//note the error logging 
var numberPosts = client.get("global:nextPostId", function (error, response) { 
    if (error) { 
    console.log("async: " + error); 
    } else { 
    console.log("programming: " + response); 
    } 
}); 

console.log("is lotsa fun: " + numberPosts); 

影子嚮導指出你試圖使用numberPosts之前有東西在裏面,因爲client.get()不是招」 t返回任何東西。

閱讀這得到node.js的一個手柄流:

http://www.scribd.com/doc/40366684/Nodejs-Controlling-Flow

+1

除了你已經引入了一個全局變量(「client」)之外,這與最初發布的內容完全相同,對吧?爲什麼這會有所作爲? – Pointy 2011-02-15 13:45:22

0

我在應用MVC框架時遇到了同樣的問題。 爲了解決這個問題,我使用了渲染功能。

在柱模型

exports.get = function(id,render) { 
    client.incr('post:id:'+id, function(err, reply) { 
    render(reply); 
    }); 
}; 

在所述柱控制器

exports.get = function(req, res) { 
    posts.get('001', function (data){res.render('index',{post:data});}); 

};