gpt4 book ai didi

javascript - 带循环的 Node promise

转载 作者:行者123 更新时间:2023-11-30 16:29:06 24 4
gpt4 key购买 nike

这是我的问题:

我正在向我的数据库中的一个表发出请求,该请求的结果是我想向另一个表发出两个请求,这两个请求的结果想将它们添加到主请求(第一个)。问题是这两个请求实际上已经发出,但是当我试图将两者的结果都放在主要结果中时,我不会这样做。 The 2nd Then 也在第一个没有结束时运行(假设在第一个循环结束时结束)

也许这个错误很愚蠢,我是 promises 的新手。

谢谢

提取码:

var express = require("express");
var app = express();
var Promise = require('bluebird');
var bodyParser = require('body-parser')
var mysql = require('promise-mysql');

app.get('/misPartidos', function (req, res) {

var query = conexion.query('SELECT partidos.id_partido, partidos.id_torneo, partidos.nlocal, partidos.nvisitante, partidos.idlocal,partidos.idvisitante, partidos.jornada, partidos.glocal, partidos.gvisitante, partidos.fecha, torneos.nombre_torneo, partidos.estado, torneos.version, torneos.modo, torneos.tipo FROM partidos INNER JOIN equipos ON(equipos.id_equipo = partidos.idlocal OR equipos.id_equipo = partidos.idvisitante) INNER JOIN participantes ON(equipos.id_equipo = participantes.id_equipo AND equipos.id_torneo = participantes.idtorneo_part) INNER JOIN torneos ON(participantes.idtorneo_part = torneos.id_torneo) WHERE participantes.username = "'+ req.query.usuario + '" ORDER BY jornada ASC')
.then(function(success){
for(var x in success){
conexion.query('SELECT username,nombre_eq FROM equipos WHERE id_equipo = '+success[x].idlocal)
.then(function(local){
success[x].local = local[0].username;
});
conexion.query('SELECT username, nombre_eq FROM equipos WHERE id_equipo = '+success[x].idvisitante)
.then(function(visitante){
success[x].visitante = visitante[0].username;
});
return success;
}

}).then(function(resultado){
console.log(results);
}).catch(function(error){
console.log(error);
});
});

最佳答案

假设您的success 参数是一个查询结果数组,您可以这样做:

var express = require("express");
var app = express();
var Promise = require('bluebird');
var bodyParser = require('body-parser')
var mysql = require('promise-mysql');

app.get('/misPartidos', function (req, res) {
var queryString = 'SELECT partidos.id_partido, partidos.id_torneo, partidos.nlocal, partidos.nvisitante, partidos.idlocal,partidos.idvisitante, partidos.jornada, partidos.glocal, partidos.gvisitante, partidos.fecha, torneos.nombre_torneo, partidos.estado, torneos.version, torneos.modo, torneos.tipo FROM partidos INNER JOIN equipos ON(equipos.id_equipo = partidos.idlocal OR equipos.id_equipo = partidos.idvisitante) INNER JOIN participantes ON(equipos.id_equipo = participantes.id_equipo AND equipos.id_torneo = participantes.idtorneo_part) INNER JOIN torneos ON(participantes.idtorneo_part = torneos.id_torneo) WHERE participantes.username = "'+ req.query.usuario + '" ORDER BY jornada ASC';

Promise.map(conexion.query(queryString), function(item) {
return Promise.all([
conexion.query('SELECT username,nombre_eq FROM equipos WHERE id_equipo = '+item.idlocal).then(function(local) {
item.local = local[0].username;
}),
conexion.query('SELECT username, nombre_eq FROM equipos WHERE id_equipo = '+item.idvisitante).then(function(visitante){
item.visitante = visitante[0].username;
})
]).then(function() {
// make the return value from `Promise.all()` be the item
// we were iterating
return item;
});
}).then(function(results) {
// array of results here
console.log(results);
}).catch(function(err) {
// error here
console.log(err);
});
});

这会执行以下操作:

  1. 使用 Bluebird 的 Promise.map() 遍历第一个查询的所有结果
  2. 在每次迭代中使用 Promise.all(),这样每次迭代都会返回一个代表您执行的两个子查询的 promise 。
  3. 返回单个项目作为每次迭代的结果
  4. 完成所有迭代和子查询后,您应该会得到一组结果。

关于javascript - 带循环的 Node promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33615814/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com