从控制器返回promise值

时间:2016-04-06 17:28:52

标签: node.js express promise

我正在使用Node,Express和Objection.js。 我的文件结构是:

 ->Project Folder
   ->Controllers(folder)
     ->agenciaController.js
   ->Models(folder)
     ->Agencia.js
   ->index.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].

我的问题是:是否可以将listaApuestas从控制器返回到index.js,并在promise中获得值?

3 个答案:

答案 0 :(得分:0)

agenciaController.getAgencias()应使用您选择的promise库进行宣传。

我建议使用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; 

示例app.js

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

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

这将输出:

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

答案 1 :(得分: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))
});

答案 2 :(得分:0)

fn: async function() {
    var output = '';
    await myPromise()
    .then((data) => {
        output = data;
    })
    .catch((err) => {
        output = "Error: " + err;
    });

    return ans;
}

注意我们如何在 await 返回其值之前 fn 完成承诺