【问题标题】: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);

}

【问题讨论】:

    标签: javascript node.js callback mongoose mean-stack


    【解决方案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 返回函数。

      【讨论】:

        猜你喜欢
        • 2022-01-22
        • 2013-05-21
        • 1970-01-01
        • 2014-12-05
        • 1970-01-01
        • 2017-08-07
        • 2017-06-30
        • 1970-01-01
        • 2019-03-12
        相关资源
        最近更新 更多