2015-10-02 4 views
0

У меня есть эта структура кода:Node.js - MySQL запросов внутри Еогеасп

connection.query(query1,function(err,rows) { 
    var response = []; 
    //doing something with rows 
    rows.forEach(function(item) { 
     connection.query(queryItem,function(err,rows) { 
      //doing something 
      result = rows[0].field; 
      //and want to push it to an array 
      response.push(result); 
     }); 
    }); 
    console.log(response); //empty 
}); 

Я знаю, что Foreach блокирует, но запрос не является блокирующим. Я пытался использовать обещания:

connection.query(query1,function(err,rows) { 
    var response = []; 
    //doing something with rows 
    rows.forEach(function(item) { 
     var promise = new Promise(function(resolve,reject) { 
      connection.query(queryItem,function(err,rows) { 
       //doing something 
       result = rows[0].field; 
       //and want to push it to an array 
       resolve(result); 
      }); 
     }); 
     promise.then(function(result) { 
      console.log(result); //ok 
      response.push(result) //not ok, result is empty 
     }); 
    }); 
    console.log(response); //empty 
}); 

Но это не помогло. Как я могу передать значение в массив из неблокирующей функции и использовать его после?

+0

Является ли это своеобразным обещанием или синей птицей? – Selfish

+0

Я новичок в узле. требует ('обещания'); Может быть родным, я не знаю =) –

ответ

2

Создание обещаний - шаг в правильном направлении, но вам нужно сделать еще один шаг, объединив обещания в массив и перейдя в Promise.all, а затем дождавшись их завершения до попытки доступа к response ,

connection.query(query1,function(err,rows) { 
    var response = []; 
    //doing something with rows 
    Promise.all(rows.map(function(item) { 
     var promise = new Promise(function(resolve,reject) { 
      connection.query(queryItem,function(err,rows) { 
       //doing something 
       result = rows[0].field; 
       //and want to push it to an array 
       resolve(result); 
      }); 
     }); 
     return promise.then(function(result) { 
      console.log(result); //ok 
      response.push(result) //ok 
     }); 
    }).then(function() { 
     console.log(response); //not empty 
    }); 
}); 
+1

Обратите внимание, что это приводит к отправке n запросов в вашу базу данных одновременно, скорее всего, было бы лучше объединить их все в одну транзакцию, что также устранит необходимость в обещаниях в этом случае. Не обращайте внимания, если это инструкция SELECT, и в этом случае вы могли бы просто сделать один запрос, который будет получать данные, а затем группировать по элементу. Отправка запросов в цикле, как это, как правило, является плохой идеей с точки зрения производительности. –

+0

Это работа! Но если я делаю «console.log» вне Promise.all - это пусто. Это значит, что я должен поставить свой следующий код в обещание. Или есть какой-то способ? –

+0

И спасибо за совет о сложном запросе SELECT. Я попробую. –

Смежные вопросы