#node.js #arrays #json #sql-server #promise
Вопрос:
Я использую promise
.
Теперь я пытаюсь поместить обещание в запрос цикла, предположив result2['recordset']
, что у меня есть 2 данных.
result2['recordset'].forEach(function(element, index){
var query = new Promise((success, failure) => {
request.query("SELECT M.id, M.name, M.link, M.project_idfk, M.icon FROM tbl_module M WHERE M.project_idfk = '" element.project_idfk "' AND M.id IN(SELECT module_idfk FROM tbl_access_module WHERE group_idfk = '" element.group_idfk "' AND role IS NOT NULL AND(role = 'CREATE' OR role = 'VIEW'))", function (err, result3){
success(result3['recordset']);
console.log(result3['recordset']);
});
});
});
query.then(function(result) {
console.log(result);
res.json({ module: result });
})
Когда я попытался console.log(result3['recordset']);
, он показал мне все данные.
[
{
id: 6,
name: 'Department',
link: 'department',
project_idfk: 2,
icon: 'glyphicon-tasks'
}
]
[
{
id: 1,
name: 'Location',
link: 'location',
project_idfk: 1,
icon: 'glyphicon-screenshot'
},
{
id: 2,
name: 'Device',
link: 'device',
project_idfk: 1,
icon: 'glyphicon-hdd'
},
{
id: 3,
name: 'Floor Map',
link: 'map',
project_idfk: 1,
icon: 'glyphicon-map-marker'
},
{
id: 4,
name: 'Notification',
link: 'notificaction',
project_idfk: 1,
icon: 'glyphicon-globe'
},
{
id: 5,
name: 'Report',
link: 'report',
project_idfk: 1,
icon: 'glyphicon-tasks'
}
]
Но почему, когда я попытался console.log(result);
, он показал мне только первые данные (без идентификационного номера 6)?
[
{
id: 1,
name: 'Location',
link: 'location',
project_idfk: 1,
icon: 'glyphicon-screenshot'
},
{
id: 2,
name: 'Device',
link: 'device',
project_idfk: 1,
icon: 'glyphicon-hdd'
},
{
id: 3,
name: 'Floor Map',
link: 'map',
project_idfk: 1,
icon: 'glyphicon-map-marker'
},
{
id: 4,
name: 'Notification',
link: 'notificaction',
project_idfk: 1,
icon: 'glyphicon-globe'
},
{
id: 5,
name: 'Report',
link: 'report',
project_idfk: 1,
icon: 'glyphicon-tasks'
}
]
Комментарии:
1.
.forEach()
не осознает обещаний, поэтому вам абсолютно бесполезно заключать свой запрос в обещание внутри.forEach()
цикла.2. Привет, @jfriend00, есть ли какой-нибудь способ справиться с этим?
3. Вы, похоже, ничего не делаете с результатами запроса, поэтому, чтобы знать, что рекомендовать, нам нужно посмотреть, что вы пытаетесь с ними сделать, и увидеть этот код. Кроме того, нам нужно знать, нужно ли упорядочивать цикл или каждая итерация может выполняться параллельно.
4. И, это помогло бы узнать, какой модуль базы данных из NPM вы используете, потому что в большинстве случаев в наши дни есть возможность встроенной поддержки обещаний.
Ответ №1:
В начале не будет обрабатывать обещания, Измените это на карту и используйте Promise.все для получения результатов.
const promises = result2["recordset"].map(function (element, index) {
return new Promise((success, failure) => {
request.query(
"SELECT M.id, M.name, M.link, M.project_idfk, M.icon FROM tbl_module M WHERE M.project_idfk = '"
element.project_idfk
"' AND M.id IN(SELECT module_idfk FROM tbl_access_module WHERE group_idfk = '"
element.group_idfk
"' AND role IS NOT NULL AND(role = 'CREATE' OR role = 'VIEW'))",
(err, result) => {
success(result["recordset"]);
console.log(result["recordset"]);
}
);
});
});
Promise.all(promises).then(function (result) {
console.log(result); // list or all result
// Do something and send response
res.json({ module: result });
});