在承诺解决不起作用后返回

时间:2017-03-13 06:39:22

标签: javascript node.js promise

我有一个这样的函数,它应该在查询完成后返回一个模式。我不明白为什么这个函数总是返回未定义的值。

var loadSchema = function(className) {
	var query = schemaModel.findOne({className: className})
	var promise = query.exec()

	promise.then(function(schema){
		console.log(schema)
		return schema
	}).then(null, console.log)
}

我也试图从功能中返回一个完整的承诺,但我仍然无法获得价值。喜欢这个

var loadSchema = function(className) {
	var query = schemaModel.findOne({className: className})
	var promise = query.exec()

	return promise.then(function(schema){
		console.log(schema)
		return schema
	}).then(null, console.log)
}

任何人都可以告诉我这个程序的流程。我在stackoverflow中看过其他类似的问题,但我无法理解这一点。

编辑: 这是我使用此值的代码。

module.exports.getSchema = function(req) {
	var className  = req.params.classname
	var schema = loadSchema(className)
	console.log(schema)
	return schema
}

1 个答案:

答案 0 :(得分:1)

您的return语句将返回您作为.then参数提供的函数。

解决这个问题的一种方法是为你的loadSchema函数提供一个回调函数,该函数在then函数体内执行,如下所示:

var loadSchema = function(className, callback) {
    var query = schemaModel.findOne({className: className});
    var promise = query.exec();

    promise.then(function(schema) {
        console.log(schema);
        callback(schema);
    }).then(null, console.log);
}

module.exports.getSchema = function(req, callback) {
    var className  = req.params.classname
    loadSchema(className, callback)
}

theModule.getSchema("req", function(schema) {
    //do stuff
});

您还可以让您的函数返回承诺,然后在.then电话后链接loadSchema。我不确定你的schemaModel变量是什么,但它将是......

var loadSchema = function(className, callback) {
    var query = schemaModel.findOne({className: className});
    var promise = query.exec();

    return promise;
}

module.exports.getSchema = function(req, callback) {
    var className  = req.params.classname
    return loadSchema(className, callback)
}

theModule.getSchema("aClassName").then(...)...

请参阅此处以获取上述语句的示例,其中包含手动生成的承诺:http://plnkr.co/edit/dVRs5cmErPp0JCd5CQPU