2016-04-06 12 views
0

Ich arbeite mit Node, Express und Objection.js. Meine Dateistruktur ist:Rückgabe Versprechen Wert von Controller

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

in meinem index.js-Code ist:

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

Und mein agenciaController.js ist:

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; 
    } 
} 

Mein Problem ist, dass, wenn ich laufen die Code, ich bekomme

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

Aber ich brauche:

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

Meine Frage ist: ist es möglich, listaApuestas vom Controller zum index.js zurückzukehren, mit dem Wert in dem Versprechen erhalten?

+2

Sie uderstand nicht, wie Versprechungen arbeiten, untersuchen [ Dieser Artikel] (https://pouchdb.com/2015/05/18/we-have-a-problem-with-promises.html?utm_source=javascriptweekly&utm_medium=email). – alexmac

Antwort

0

agenciaController.getAgencias() sollte mit Hilfe der Promise-Bibliothek Ihrer Wahl promomifiziert werden.

Ich empfehle die Verwendung bluebird.

Der Trick Teil ist, dass, wenn ein Versprechen in einem anderen Versprechen liegen, müssen Sie Ihre Struktur ein wenig ändern.

Probe 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; 

Probe app.js

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

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

erhalten Sie folgende Ausgabe:

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

Dank für Ihre Hilfe danken! Endlich mehr über Versprechungen zu lernen und ihren Beispielen zu folgen, löste das Problem. Hier ist der Code verwende ich das Problem

Mein agenciaController.js zu lösen:

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"); 
      }); 
    } 
} 

Und mein 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)) 
}); 
Verwandte Themen