首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带环节点承诺

带环节点承诺
EN

Stack Overflow用户
提问于 2015-11-09 18:33:56
回答 2查看 903关注 0票数 1

这是我的问题:

我向数据库中的一个表发出请求,结果是我想向另一个表提出两个请求,这两个请求的结果希望将它们添加到主请求中(首先)。问题是,这两项要求实际上是提出的,但当试图将两者的结果放在主要结果中时,我是不会允许的。第二个循环也在第一个循环结束时运行(假设在第一个循环结束时结束)。

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

谢谢

摘录代码:

代码语言:javascript
复制
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);
 });
});
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-09 23:20:51

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

代码语言:javascript
复制
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. 使用蓝知更鸟的Promise.map()迭代第一个查询的所有结果
  2. 在每个迭代中使用Promise.all(),以便每个迭代都返回一个表示您所做子查询的承诺。
  3. 返回单个项作为每次迭代的结果
  4. 当所有的迭代和子查询完成后,您应该得到一个结果数组。
票数 1
EN

Stack Overflow用户

发布于 2015-11-09 21:10:18

在承诺上有麻烦是可以的。这是件棘手的事。

首先,保存这个关于承诺和问题的伟大的文章

关于你的问题。问题是承诺是异步的,而for-循环则不是。您需要使用map-循环并返回它。它将保证所有的行动都会完成,只有在第二个承诺开始之后。有两种方式:

  • 使用允诺(ES6):return Promise.all( array_of_your_elements.map( elem => { // some actions // ... return; }))
  • 使用异步等待(ES7):async function_name() { await* array_of_your_elements.map( elem => { // some actions // ... return; }) }

我更喜欢第二条路。

重要的:您应该始终在地图中使用返回。它可以是空返回(如示例中的那样)或其他什么。例如,如果在每次迭代时返回字符串,它将为您提供一组包含字符串的承诺。

享受承诺吧!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33615814

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档