2014-04-28 128 views
0

我正在使用redis使用節點(node_redis模塊),並試圖包裝我的檢索代碼進行調試和幹,並無法理解爲什麼下面的函數不工作。異步功能不工作

我比JavaScript的基本異步有點新,所以我不認爲這與壞js以外的任何事情有關。

這工作正常,但其中包裝膜是很沒有意義的:

// wrapper 
function asyncLoad(className, id, callback) { 
    redisClient.hget(className, id, callback); 
} 
// execution 
asyncLoad('Person',1234,function(err,res) { 
    if (err) { 
    console.log(err); 
    } else { 
    var obj = JSON.parse(res); 
    console.log(obj); 
    } 
}); 

我想如果我能做到這一點,將是調試和重複有用的,但我肯定做錯了什麼......

// wrapper 
function asyncLoad2(className, id, callback) { 
    redisClient.hget(className, id, function(err,res,callback) { 
    console.log(callback); 
    if (err) { 
     console.log(err); 
    } else { 
     var obj = JSON.parse(res); 
     callback(obj); 
    } 
    }); 
} 
// execution 
asyncLoad2('Person',1234,function(obj) { 
    //simpler way to get back a parsed object with error handling already done 
} 

在此先感謝! PS - 我知道這真的是錯誤的處理;我不打算一直使用它,只是爲了選擇東西,特別是在調試過程中。

+0

在您忘記了第一個片段'obj'前面的'var',在拼寫錯誤的第二個片段中'Parse'(應該小寫) – Bergi

+1

正確,固定 - 發生在翻譯成片段時編輯。謝謝:) – tekunokurato

回答

2
function asyncLoad2(className, id, callback) { 
    redisClient.hget(className, id, function(err,res,callback) { 

在這裏,您預計redisClient給您通過callback - 但它不,它只是將通過兩個errres參數。 callback參數會影響asyncLoad2函數中的callback變量,您將無法訪問它。刪除參數:

function asyncLoad2(className, id, callback) { 
    redisClient.hget(className, id, function(err,res) { 
    // now refer to the actual `callback` that was passed into `asyncLoad2` 
+0

美麗,非常有意義,非常感謝你的幫助! – tekunokurato

0

作爲參考,這裏是最後的功能;錯誤記錄是自動的,你可以做別的事情與錯誤,如果你想要的,你總是得到一個解析的哈希值,這是很好乾:

// wrapper 
function asyncLoad(className, id, callback) { 
    redisClient.hget(className, id, function(e,r) { 
    if (e || !r) { 
     console.log('Error retrieving from database: '); 
     console.log(e); 
     callback(e,r); 
    } else { 
     var parsed = JSON.parse(r); 
     callback(e,parsed); 
    } 
    }); 
} 
// use 
asyncLoad('Person',1234, function(e,r) { 
    if (e) { 
    // do something besides just log 
    } else { 
    // the rest of your stuff here 
    } 
}); 

而且我甚至想我能元程序完整的對象的重建(因爲jsonified串缺乏原型或功能),雖然這種技術依賴於我寫的方式我的構造函數,應該非常小心使用(和徹底的測試!):

... 
var parsed = JSON.parse(r); 
var obj = reconstructObj(className, parsed); 
callback(e,obj); 
... 

function reconstructObj(className,hash) { 
    //instantiate a new object of the correct class 
    var obj = eval('new ' + className + '()'); 
    //overwrite the properties from the hash values 
    for (prop in hash) { 
    obj[prop] = hash[prop]; 
    } 
    return obj; 
}