2017-06-20 85 views
0

有没有办法暂停map函数的迭代,以便我可以从我的查询中获得响应并将其存储在某个对象中。用多个mysql查询中的数据填充对象数组

所以我的数据是对象的数组,我想添加属性“接收器”为每一个对象数组,所以我通过我的阵列中使用的地图funtion循环,问题是在回调:d,我的对象reveive数据后我的快递公司发送了回复,所以我必须对Timeout进行适当的响应,但我知道它不是正确的解决方案,但现在可以工作,因为我在数据库中只有40-50条记录。

下面是代码:

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); 

我使用快递为我的API路线和节点MySQL模块,也许我用前人的精力承诺或异步函数从节点,我不知道。

你有什么想法吗?

+1

我建议重写你的SQL查询来处理一个查询中的整个数组,但如果你不想这样做,我会给你一个使用promise的建议。 –

+0

嗯你是什么意思在一个查询整个数组?我需要有一个对象数组(对象是一些随机消息)和一些消息可以有多个接收器,我有表存储谁收到这条消息,但我不知道如何填充该对象与该阵列的惊人表格... @PatrickRoberts –

回答

3

这里有一个方法使用Promises如果你不想重构你的SQL查询:

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 
    }); 
}); 

或者类似的东西。

+1

谢谢老兄,那正是我需要的,谢谢! 猜猜我还有很多需要了解的承诺:D –