1. ホーム
  2. ジャバスクリプト

[解決済み】node.jsでユニークなIDを生成する方法

2022-04-03 18:24:08

質問

function generate(count) {
    var founded = false,
        _sym = 'abcdefghijklmnopqrstuvwxyz1234567890',
        str = '';
    while(!founded) {
        for(var i = 0; i < count; i++) {
            str += _sym[parseInt(Math.random() * (_sym.length))];
        }
        base.getID(string, function(err, res) {
            if(!res.length) {
                founded = true; // How to do it?
            }
        });
    }
    return str;
}

データベースクエリコールバックで変数値を設定するには?どうすればいいのでしょうか?

どのように解決するのですか?

node.jsを使うのは久しぶりなのですが、お役に立てるかもしれません。

まず、nodeではシングルスレッドしかなく、コールバックを使用することになっています。あなたのコードで何が起こるかというと、それは base.getID クエリは実行のためにキューに入れられますが while ループは無意味にビジー・ループとして実行され続けます。

以下のようなコールバックで問題を解決できるはずです。

function generate(count, k) {
    var _sym = 'abcdefghijklmnopqrstuvwxyz1234567890',
    var str = '';

    for(var i = 0; i < count; i++) {
        str += _sym[parseInt(Math.random() * (_sym.length))];
    }
    base.getID(str, function(err, res) {
        if(!res.length) {
          k(str)                   // use the continuation
        } else generate(count, k)  // otherwise, recurse on generate
    });
}

そして、このように使用します。

generate(10, function(uniqueId){
  // have a uniqueId
})

私は2年ほどnode/jsをコーディングしていないので、これをテストしていませんが、基本的な考え方は同じはずです - ビジーループを使用せず、コールバックを使用することです。nodeのasyncパッケージを見てみるといいかもしれません。