Pada dasarnya, saya memiliki objek dengan kunci dan nilai string (mis. {"michigan":"minnesota"}). Saya mencoba mengulang semua pasangan nilai kunci ini dan membuat kueri dari database saya, dan menambahkan hasilnya ke daftar, yang kemudian akan dikembalikan ke ujung depan.

var return_list = []

        Object.keys(obj).forEach(function(key){
            const state1 = key;
            const state2 = obj[key];

            const sql_select = 'SELECT column1,column2 from database WHERE state = ? OR state=?';
        
            db.query(sql_select,[state1,state2], (err,result) => {
                
                return_list.push(result);
            });
        })

Inilah yang saya miliki dalam istilah yang paling sederhana, dan ingin mengirim return_list kembali ke ujung depan. Masalah yang saya hadapi adalah saya dapat console.log hasilnya dalam panggilan db.query, tetapi saya tidak dapat mendorong hasilnya ke daftar atau memanggilnya di mana saja di luar kueri. Saya cukup baru dalam pengembangan front end dan back end, jadi ide apa pun yang mungkin pasti akan sangat membantu!

0
Jon Underwood 4 Januari 2021, 22:02

3 jawaban

Jawaban Terbaik

Masalahnya adalah forEach mengembalikan void.
Jadi Anda tidak bisa menunggu kode asinkron berjalan sebelum Anda mengembalikannya.
Saat kita berurusan dengan serangkaian janji seperti kueri db ( seperti dalam kasus Anda ) atau panggilan API, kita harus menunggu hingga semuanya dieksekusi.
Saat itulah kami menggunakan Promise.all

Coba lakukan seperti ini:

const queryResults = await Promise.all(
   Object.keys(obj).map(async (key) => {
    const state1 = key;
    const state2 = obj[key];

    const sql_select = 'SELECT column1,column2 from database WHERE state = ? OR state=?';

    return new Promise((resolve, reject) => 
      db.query(sql_select,[state1,state2], (err, result) => {
        if (err) 
          return reject(err)
        else
          return resolve(result)
      })
    )
  })
)
console.log('queryResults', queryResults)
// now you give this queryResults back to your FE

Kiat kecil untuk awal baru Anda:

0
Felipe Malara 4 Januari 2021, 19:16

Pertama, pastikan Anda bekerja dengan mysql2 dari npm. Yang menyediakan metode async mysql. Kedua, Perhatikan bahwa ketika Anda menanyakan SELECT, Anda tidak mendapatkan hasil "nyata" terlebih dahulu. Misalkan Anda mendapatkan result, maka, hasil "nyata" diadakan di result[0].

(async () => {
    const promiseArr = [];

    for (const key of Object.keys(yourOBJ)) {
        const state1 = key;
        const state2 = yourOBJ[key];
        const sql_select = 'SELECT column1,column2 from database WHERE state = ? OR state=?';

        promiseArr.push(db.query(sql_select, [state1, state2]));
    }

    let results;

    try {
        results = await Promise.all(promiseArr);
    } catch (e) {
        throw '...';
    }

    const return_list = results.reduce((finalArray, item) => {
        finalArray = [
            ...finalArray,
            ...item[0],
        ]
    }, []);
})();
0
Tal Rofe 4 Januari 2021, 19:36

Masalahnya adalah karena transaksi basis data tidak instan, jadi Anda perlu menggunakan janji atau async-wait.

Menggunakan async menunggu akan menjadi seperti ini (belum diuji),

async function get_return_list () {
    var return_list = []

    Object.keys(obj).forEach(function(key){
        const state1 = key;
        const state2 = obj[key];
    
        const sql_select = 'SELECT column1,column2 from database WHERE state = ? OR state=?';
    
         await db.query(sql_select,[state1,state2], (err,result) => {
            
            return_list.push(result);
        });
    })

    return return_list
} 

Lihat untuk detail lebih lanjut: https://eloquentjavascript.net/11_async.html

0
Henry Russell 4 Januari 2021, 19:16