Как использовать условия в цикле while в Node JS, который имеет асинхронную функцию запроса с условиями цикла, измененными только в функциях обратного вызова?

1

В моей программе nodejs цикл while имеет условия, которые могут быть изменены асинхронной функцией внутри него. Но, поскольку функция асинхронна, программа движется в бесконечном цикле. Как обойти это?

let unique = true
while(unique)
{
    console.log("Inside Loop")
    let id = random.generate(5)
    let u_query = "Insert into table_db (id, name) values ("+db.escape(id)+", "+db.escape(name)+")";
    db.query(u_query, (error, results, fields) => {
        console.log("Inside Query")
        if(error)
        {
            if(error.code !== 'ER_DUP_ENTRY')
                throw error
        }
        else
        {
            unique = false // to stop execution
            res.send("Shorted URL : "+newURL)
            // break is giving error
            //SyntaxError: Illegal break statement
        }
    })
    // To check if loop is stopping and asynch function is causing infinite loop
    // I used unique = false here
}

Спасибо!

Теги:
callback
asynchronous

2 ответа

1
Лучший ответ

Используйте рекурсию, чтобы убедиться, что все запросы db выполняются синхронно, вот пример:

function nextQuery() {

    let id = random.generate(5)
    let u_query = "Insert into table_db (id, name) values ("+db.escape(id)+", "+db.escape(name)+")";

    db.query(u_query, (error, results, fields) => {

        if (error) {

            if (error.code !== 'ER_DUP_ENTRY')
                throw error

            // call nextQuery()
            return nextQuery();
        }
        else {

            return res.send("Shorted URL : "+newURL) // to stop execution
        }

    })
}

nextQuery();
1

Вы можете использовать async/await 7.9.0 на узле> 7.9.0, например:

const whatever = async () => {
    let unique = true
    while(unique)
    {
        const id = random.generate(5)
        const u_query = 'Insert into table_db (id, name) values (${db.escape(id)}, ${db.escape(name)})'

        await new Promise(resolve => db.query(u_query, error => {
            if(error) {
                if(error.code !== 'ER_DUP_ENTRY') throw error
            } else {
                unique = false
                res.send('Shorted URL : ' + newURL)
            }

            resolve()
        }))
    }
}

await new Promise приостановит вашу функцию до тех пор, пока не будет достигнуто обещание. Он не будет блокировать основной поток.

Я не знаю, чего вы пытаетесь выполнить, но похоже, что вы пытаетесь создать свой собственный уникальный идентификатор. Я думаю, что все, что вы используете, может справиться с этим. Просто найдите время для поиска документов db/driver, которые вы используете. Попытка создать уникальный идентификатор так, как вы это делаете, кажется очень неэффективной.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню