// if the result is empty, the generated code does not exist in database. So it can be used.
while(result.length != 0){
var result = conn.query("SELECT * FROM user WHERE code = abc");
}
3 Réponses :
Fondamentalement, vous devrez travailler avec async \ attendre ou des promesses (à peu près la même). https://javascript.info/async-await https://developer.mozilla.org/fr- US / DOCS / Web / JavaScript / Référence / Global_Objects / Promise P>
De cette façon, vous pourrez seulement retourner lorsque vous obtenez le bon résultat pour vous. P>
var mysql = require('mysql');
var pool = mysql.createPool({
host : 'YOUR_HOST_NAME',
user : 'YOUR_USER_NAME',
password : 'YOUR_PASSWORD',
database : 'YOUR_DATABASE'
});
pool.getConnection(function(err, connection) {
// connected! (unless `err` is set)
});
connection = mysql.createPool
var retryLimit=0;
var getData = function () {
if(retryLimit <= 50)
{
retryLimit++;
connection.query('SELECT * FROM user WHERE code = abc', function (error, results, fields) {
if (error) {throw error;}
else if(result.length <1) {
getData();
//call the same method again.
}
});
}
}
getData();Et s'il y a un grand non. des utilisateurs dans la base de données dont les codes sont présents? Dans ce cas, la pile d'appels se développera assez volumineuse et le code pourrait s'écraser avec une taille de pile d'appels maximale dépassée une exception.
Ne fais pas ça. En effet max. CallStack va être un problème ici.
Vous devrez utiliser des rappels ou des fonctions de promesses / asynchrones. Voici comment il pourrait être écrit avec des rappels:
const mysql = require('promise-mysql');
async function getData(connection) {
const retryLimit = 50;
for (let i = 0; i < retryLimit; i++) {
const code = generatePrizeCode();
const result = await connection.query('SELECT * FROM user WHERE code = ?', code);
if (result.length === 0) { // this code doesn't exist yet
return code;
}
}
throw new Error('retry limit exceeded');
}
(async () => {
try {
const connection = await mysql.createConnection({
database: 'test',
host: 'localhost',
password: 'hunter2',
user: 'dave',
});
try {
const code = await getData(connection);
// do what you want here, e.g., console.log(code)
} finally {
connection.end();
}
} catch (err) {
console.log(err);
}
})();
Que voudriez-vous réaliser? Vous souhaitez réessayer si tout est arrivé ou que vous souhaitez exécuter le même code à un numéro indéfini?
@AnoopMC Je veux exécuter à plusieurs reprises la requête tant que le résultat de la requête contient des données (une ou plusieurs lignes).
Vous pouvez créer une méthode qui continuera à essayer jusqu'à ce que le résultat soit là. Donc, fondamentalement, TI appellera à nouveau la méthode s'il y a une erreur. Pour éviter une boucle infinie, vous pouvez utiliser le nombre maximum de tentatives avec un compteur.
@AnoopMC Voulez-vous s'il vous plaît élaborer ou donner un exemple de lien?
Bien sûr, avez ajouté l'extrait de code dans les réponses. S'il vous plaît modifier et utiliser.
Si je comprends bien, correctement 'seinterval' est votre ami