如何将内部回调的结果传递给其父函数? [复制]
Posted
技术标签:
【中文标题】如何将内部回调的结果传递给其父函数? [复制]【英文标题】:How to pass a result from inside callback out into its parent function? [duplicate] 【发布时间】:2016-01-11 21:37:31 【问题描述】:我正在使用 Mongoose 和 MongoDB 的 MMEAN 堆栈。我想测试集合 Foo 是否为空,但它涉及带有回调的 Mongoose find()
函数。 我不熟悉回调,所以我想知道如何从回调内部获取一条信息到其父函数中。
这是我必须遵循的 addFoo 逻辑: 1.检查Foo集合是否为空 2.如果Foo为空,保存新的Foo文档 3.如果Foo不为空,不保存新的Foo文档
我正在从 routes/index.js 调用保存方法 addFoo()
。
// routes/index.js
router.post('/foo', function(req, res, next)
var foo = new Foo(req.body);
foo.addFoo(function(err, bid)
if(err) return next(err);
res.json(foo);
);
);
// models/Foo.js
var mongoose = require('mongoose');
var FooSchema = new mongoose.Schema(
creator: String
);
mongoose.model('Foo', FooSchema);
FooSchema.methods.addFoo = function(cb)
// finds all documents of Foo into the "results" array
this.model("Foo").find(function(err, results)
if (err)return err;
// if the Foo results array is empty
if (results.length == 0)
// HOW DO I LET addFOO() KNOW THAT THE ARRAY IS EMPTY?
// somehow pass the boolean out to addFoo()
);
// IF Empty
// this.save(cb);
【问题讨论】:
【参考方案1】:这将按如下方式工作......
FooSchema.methods.addFoo = function(cb)
var that = this;
this.model("Foo").find(function(err, results)
if (err)return err;
// if the Foo results array is empty
if (results.length == 0)
that.save(cb);
);
但是,如果您想根据实际要求将其传递给父母,那么您可以尝试如下 ....
FooSchema.methods.addFoo = function(cb)
var that = this;
this.model("Foo").find(function(err, results)
if (err)return err;
// if the Foo results array is empty
that.commit(!results.length);//Calling a parent function from inside callback function
);
function commit(doCommit)
if(doCommit)
that.save(cb);
【讨论】:
【参考方案2】:简短的回答:你不知道。
回调在addFoo
函数结束后执行。您基本上会将函数的其余部分放在回调中。
由于您需要访问this
,您可以通过var self = this;
将其绑定到一个变量,然后在回调中使用self
。
另一种选择是使用 Promise 和 denodeify
函数,将回调请求函数转换为 Promise
返回函数。
【讨论】:
以上是关于如何将内部回调的结果传递给其父函数? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
c++ - 如何将多维数组传递给没有内部维度的函数? [复制]