2016-02-09 3 views
0

У меня есть приложение node.js, и я использую sequelize и mysql для базы данных.Как направить результат запроса secelize на массив

Я просматривал документы sequelize и bluebird, пытаясь найти способ перетащить запрос sequelize в массив. У меня есть массив заказов, которые я прокручиваю, а затем выполняю запрос по адресной модели.

я мой запрос выглядит следующим образом:

var objArr = []; 
    models.address.findById(6).then(function(address){ 
     objArr.push(address); 
    }); 
    console.log(objArr); 

если я двигаю console.log в запросе он работает, но за пределами objArr пуст. Я пытаюсь понять, почему это так. Разве это невозможно сделать? Я не могу найти ответ здесь или документы, упомянутые выше. Я готов читать больше докторов, если кто-то может мне точку в правильном направлении

ответ

0

Это потому, что обратный вызов асинхронный ... порядок выглядит следующим образом:

var objArr = []; 

models.address.findById(6); //makes query, starts waiting for a response 

// array is empty at this point 
console.log(objArr); 

//at a later time got answer, invoking callback 
.then(function(address){ 

}) 

Это псевдокод, просто чтобы проиллюстрировать этот момент. Этот код не будет работать

это, скорее всего, вы пытаетесь сделать что-то вроде этого:

function() { 
    var objArr = []; 
    models.address.findById(6).then(function(address){ 
    objArr.push(address); 
    }); 
    console.log(objArr); 
    return objArr 
} 

Вместо этого вы должны обрабатывать все это, как асинхронного кода. Пример с обратным вызовом:

function (callback) { 
    models.address.findById(6).then(function(address){ 
    callback(address); 
    }); 
} 

Или вы должны искать обещания. Вот где, что «.then» происходит от

+0

спасибо за объяснение. Я буду читать про Обещания и посмотреть, могу ли я направить это в массив – DeweyBanks

0

Ваш код асинхронно, что означает, что ваш console.log выполняется перед вашим нажатием:

var objArr = []; 
models.address.findById(6).then(function(address){ 
    objArr.push(address); 
}); 
console.log(objArr); // This code is executed before the objArr.push(address); 
+0

спасибо за быстрый ответ, что объясняет его. теперь, чтобы понять, как заставить его работать, спасибо за новое направление. – DeweyBanks

0

Вы можете сделать что-то вроде:

var objArr = []; 
models.address.findById(6).then(function(address){ 
    objArr.push(address); 
    return objArr; 
}) 
.then(console.log);