簡體   English   中英

循環中的節點 JS 回調

[英]Node JS callbacks in a while loop

我有一個 MySQL 數據庫,其表id使用nanoid模塊存儲迄今為止生成的所有唯一 id。 我已經實現了以下代碼來生成一個不在表中的唯一 ID。

//sql library
const mysql = require('mysql');
const sql_obj = require(__dirname + '/../secret/mysql.json');


//nanoid library
const { customAlphabet } = require('nanoid');
const alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
const nanoid = customAlphabet(alphabet, 30);

function uniqueid(){
    let found = 0;
    let conn = mysql.createConnection(sql_obj);
    while (found === 0){
        let id = nanoid();
        conn.connect(function(err){
            if (err){
                found = 2;
            }
            else{
                conn.query("SELECT * FROM id WHERE value = " + mysql.escape(id),function(err,result,fields){
                    if (err){
                        found = 2;
                    }
                    else{
                        if (result.length === 0){
                            found = 1;
                        }
                    }
                })
            }
        })
    }
    if (found === 2){
        return {error: 1,ret: null};
    }
    else if (found === 1){
        return {error: 0,ret: id};
    }
}

console.log(uniqueid());

我知道,我的實現是錯誤的。 因為回調本質上是異步的,所以 while 循環永遠不會結束,因此我得到了錯誤JavaScript heap out of memory
我瀏覽了 web 中的許多文章來解決這個問題,但不能。 主要問題是 function uniqueid應該返回一些值,因為我是從其他 JavaScript 文件中調用它。
謝謝你的幫助

我認為防止這種情況的最好方法是使用async/await

我承諾了您的 mySql 連接。 您可以將queryvalues發送到 function。

    //sql library
    const mysql = require('mysql');
    const sql_obj = require(__dirname + '/../secret/mysql.json');


    //nanoid library
    const { customAlphabet } = require('nanoid');
    const alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
    const nanoid = customAlphabet(alphabet, 30);

    let db = (query, values = null) => {  
        return new Promise((resolve, reject) => {
            let conn = mysql.createConnection(sql_obj);
            conn.connect(function (err) {
                if (err) {
                    reject(err);
                }
                else {
                    conn.query(query + values, function (err, result, fields) {
                        if (err) {
                            reject(err);
                            return;
                        }
                        else {
                            if (result.length === 0) {
                                resolve();
                            }
                        }
                    })
                }
            })
        })
    }

    async function uniqueid() {
        while (found === 0) {
            let id = nanoid();
            try {
                await db("SELECT * FROM id WHERE value =", mysql.escape(id));
                return { error: 0, ret: id };

            } catch (error) {
                return { error: 1, ret: null };
            }
        }
    }

    console.log(uniqueid());


暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM