2016-04-06 15 views
0

私はNode、Express、Objection.jsで作業しています。 私のファイル構造は次のとおりです。私のindex.jsコードでコントローラから約束の値を返してください

->Project Folder 
    ->Controllers(folder) 
    ->agenciaController.js 
    ->Models(folder) 
    ->Agencia.js 
    ->index.js 

は次のとおりです。

var Knex = require('knex'); 
var express = require("express"); 
var app = express(); 
var knexConfig = require('./knexfile'); 
var Model = require('objection').Model; 

var knex = Knex(knexConfig.development); 
Model.knex(knex); 

var reqAgenciaController = require('./Controllers/agenciaController'); 
var agenciaController = new reqAgenciaController(); 
app.get("/agencias", function(req, res) { 
    var respuesta = agenciaController.getAgencias(); 
    console.log("log3: "+respuesta); 
}); 

そして、私のagenciaController.jsは次のとおりです。

var Agencia = require('../Models/Agencia');  
module.exports = agenciaController;  
function agenciaController() { 
    this.getAgencias = function() { 
     var retValue = "retvalue"; 
     listaAgencias = []; 

     Agencia.query() 
      .then(function(agencias) { 
       listaAgencias = agencias; 
       console.log("log1: "+ listaAgencias); 
      }); 
     console.log("log2: "+listaAgencias); 
     return listaAgencias; 
    } 
} 

私の問題は、私が実行したときにということですコード、取得する

log2: 
log3: undefined 
log1: [object Object, object Object]. 

しかし、私は必要があります。

log1: [object Object, object Object]. 
log2: [object Object, object Object]. 
log3: [object Object, object Object]. 

私の質問は:それは約束で得られた値で、index.jsにコントローラからlistaApuestasを戻すことができますか?

+2

あなたが約束がどのように動作するかuderstandしませんが、調査します[この記事](https://pouchdb.com/2015/05/18/we-have-a-problem-with-promises.html?utm_source=javascriptweekly&utm_medium=email) – alexmac

答えて

0

agenciaController.getAgencias()は、お望みの約束ライブラリを使用してプロモーションする必要があります。

bluebirdをお勧めします。

おもしろい部分は、約束が別の約束にある場合、構造を少し変更する必要があるということです。

サンプルagenciaController.js

var Promise = require("bluebird"); 

agenciaController = { 
    getAgencias: function(callback) { 
     this.queryAsync().then(function(respuesta) { 
      console.log("log2: "+ respuesta); 
      callback(false, respuesta); 
     }) 
    }, 
    query: function(callback) { 
     console.log("log1", {}); 
     callback(false, { respuesta: "respuesta" }) 
    } 
} 

Promise.promisifyAll(agenciaController); 

module.exports = agenciaController; 

サンプル

var AgenciaController = require('./agenciaController'); 

agenciaController.getAgenciasAsync().then(function(respuesta) { 
    console.log("log3: " + respuesta); 
}); 

この意志の出力をapp.js:

log1 {} 
log2: [object Object] 
log3: [object Object] 
0

はあなたの助けをありがとう!最後に、約束についてもっと学び、その事例に従って、問題を解決しました。ここ は、私が問題に

マイagenciaController.jsを解決するために使用するコードです:

var Agencia = require('../Models/Agencia');  
module.exports = agenciaController; 

function agenciaController() {  
    this.getAgencias = function() { 

     return Agencia.query() 
      .then(function(agencias) { 
       return agencias;    
      }) 
      .catch(function(){ 
       console.log("error en la promesa"); 
      }); 
    } 
} 

そして、私のindex.js:

var reqAgenciaController = require('./Controllers/agenciaController'); 
var agenciaController = new reqAgenciaController(); 

app.get("/agencias", function(req, res) { 
    var misAgencias; 
    var promise = new Promise(function(resolve, reject) { 
     if (agenciaController.getAgencias() === undefined){ 
      reject("Error al llamar al getAgencias"); 
     }else { 
      resolve(agenciaController.getAgencias()); 
     } 
    }); 

    promise 
    .then(agencias => { 
     misAgencias = agencias; 
     console.log(misAgencias); 
     res.send(misAgencias);  
    }) 
    .catch(err => console.log("Error: "+err)) 
}); 
関連する問題