2017-06-20 2 views
0

Gibt es eine Möglichkeit, Iteration der Map-Funktion zu pausieren, so dass ich Antwort von meiner Abfrage erhalten und in einem Objekt speichern kann.Füllen Array von Objekten mit Daten aus mehreren MySQL-Abfragen

Also meine Daten sind ein Array von Objekten und ich möchte Eigenschaft "Empfänger" für jedes einzelne Objekt in Array hinzufügen, so dass ich map funtion durch mein Array Schleife Problem, ist in Rückruf: D, mein Objekt Daten nach erhalten Mein Express sendet Antwort, so musste ich mit Timeout delay Antwort, ich weiß, es ist nicht die richtige Lösung, aber es funktioniert für jetzt, weil ich nur 40-50 Datensätze in der Datenbank haben. Hier

ist der Code:

data.map((x) => { 

     let sql = ` 
     SELECT username 
     FROM message 
     JOIN message2user ON message.message_id = message2user.message_id 
     JOIN user on message2user.receiver_id = user.user_id 
     where message.message_id = ?; 
     `; 

     testDB.query(sql, x.message_id, (err, dataReceivers) => { 
     if (err) console.log(err); 

     x["receivers"] = dataReceivers; 
     }) 

    }); 


setTimeout(() => { 
     res.json({ success: true, data: data }); 
}, 1000); 

verwende ich ausdrücklich für meine API Routen und MySQL Modul für Knoten, vielleicht sould ich Promises oder Asynchron-Funktionen von Knoten verwenden, ich weiß nicht.

Haben Sie irgendwelche Ideen ??

+1

Ich würde empfehlen, Ihre SQL-Abfrage umschreiben, um nur das gesamte Array in einer Abfrage zu verarbeiten, aber wenn Sie das nicht möchten, gebe ich Ihnen einen Vorschlag mit Versprechen. –

+0

Hmm, was meinst du ganzes Array in einer Abfrage? Ich brauche Array von Objekten (Objekte sind einige zufällige Nachrichten) und einige Nachricht kann mehrere Empfänger haben, ich habe Tabelle, die speichert, die diese Nachricht erhalten, aber ich weiß nicht, wie dieses Objekt mit Array von Reverivers aus dieser Tabelle zu füllen ... @PatrickRoberts –

Antwort

3

Hier ist ein Ansatz mit Promises wenn Sie wollen nicht Ihre SQL-Abfrage Refactoring:

const sqlTemplateString = ` 
SELECT username 
FROM message 
JOIN message2user ON message.message_id = message2user.message_id 
JOIN user on message2user.receiver_id = user.user_id 
where message.message_id = ?; 
`; 

Promise.all(data.map((x) => new Promise((resolve, reject) => { 

    testDB.query(sqlTemplateString, x.message_id, (err, dataReceivers) => { 
    if (err) { 
     reject(err); 
    } else { 
     x.receivers = dataReceivers; 
     resolve(x); 
    } 
    }); 

}))).then((data) => { 
    res.json({ 
    success: true, 
    data 
    }); 
}).catch((error) => { 
    console.log(error); 

    res.json({ 
    success: false, 
    error 
    }); 
}); 

Oder so ähnlich.

+1

Danke, Alter, das ist genau das, was ich brauchte, danke !! Ich denke, ich habe noch eine Menge über Versprechen zu lernen: D –

Verwandte Themen