2015-11-09 21 views
1

這是我的問題:節點無極帶環

我在做我的數據庫中的表的請求,這一請求我想提出兩個請求另一個表,這兩個請求的結果的結果想要將它們添加到主要請求(第一個)。問題是,這兩個請求實際上是作出的,但是當試圖將兩者的結果放在主要結果中時不會讓我。第二個然後也運行時,第一個還沒有結束(假設第一個循環結束時結束)

也許錯誤是非常愚蠢的,我是承諾新手。

感謝

提取代碼:

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

在for循環後返回一個迭代 –

回答

1

假設你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. 使用藍鳥的Promise.map()通過所有從結果來迭代您的第一個查詢
  2. 在每次迭代中使用Promise.all(),以便每次迭代都會返回一個表示您所做的子查詢的單個承諾。
  3. 返回單個項目作爲每次迭代的結果
  4. 當所有的迭代和子查詢都完成後,您應該得到一個結果數組。
+0

你真了不起,很好的解釋,謝謝 –

1

它的確定有承諾的麻煩。這是一件棘手的事情。

首先,保存這個great article關於承諾和問題。

關於你的問題。問題是承諾是異步的並且for循環不是。您需要使用map-loop並將其返回。它將保證所有行動都將完成,並且只有在第二個承諾開始之後。有2種方式:

  • 使用無極(ES6): return Promise.all(array_of_your_elements.map(elem => { // some actions // ... return; }))

  • 使用異步的await(ES7):async function_name() { await* array_of_your_elements.map(elem => { // some actions // ... return; }) }

我喜歡第二個方式更多。

重要:你應該總是在地圖上使用返回。它可以是空的返回(如在示例中)或其他東西。例如,如果你會返回字符串在每次迭代,它會給你一個字符串的承諾數組。

享受承諾!

+0

而關於將終止循環異步等待https://jakearchibald.com/2014/es7-async-functions/ – crumb

+0

第二則不要等待第一個承諾已解決 –

+0

好的答案,現在我得到了這個:https://gist.github。com/martinop/61cfab7f8b72b5ae9c2a –