我在node.js.中寫了一個api。第一個Web服務端點 - /create
- 創建一個帶有隨機6字符散列的新數據庫條目,就像bit.ly散列一樣。重構非阻塞nodejs do..while循環
在PHP中做了類似的事情之後,我編寫了一個do..while
循環,它會生成一個隨機字符串並檢查我的mysql數據庫(使用node-mysql)以確保它是免費的。我還有一個計數器,所以如果需要的話,我可以在x
迭代後失敗。
var i = 0;
var alphabet = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'];
var hash = null;
var success = false;
do {
// generate a random hash by shuffling the alphabet,
// joining it and getting 6 chars
hash = alphabet.sort(function(){
return 0.5 - Math.random();
}).join('').substr(0,6);
console.log(i + ': checking hash ' + hash);
// see if it exists in the db
db.query("SELECT hash FROM trips WHERE hash = " + hash, function(err, results){
if(results.length == 0) {
// the hash is free to use :)
success = true;
} else {
// the hash is already taken :(
success = false;
}
});
// increment the counter
i++;
} while(success === false && i < 10);
我目前只在我的分貝(abcdef
)一個哈希值,但環越來越十和失敗,因爲它認爲每一個新的哈希值已經存在。
我敢肯定,這是因爲node.js的非阻塞性質。這顯然是一件好事,但在我的情況下,我需要循環來阻止,直到查詢返回。
我敢肯定,我可以做這樣的事情破解這樣的:
var q = db.query(...);
但我知道這是扔掉node.js中的一大特色
是否有這種需求的代碼模式?
請注意,我做了一個小的變化,以我的答案。 – Tomalak 2012-03-17 21:54:48