How to pass a result from inside callback out into its parent function? [duplicate]

為{幸葍}努か 提交于 2019-12-25 04:11:45

问题


I'm working with a MMEAN stack with Mongoose and MongoDB. I would like to test if the collection Foo is empty or not, but it involves a Mongoose find() function with a callback. I'm unfamiliar with callbacks, so I would like to know how to get a piece of information from inside a callback out into its parent function.

This is the logic I must follow for addFoo: 1. check if the Foo collection is empty 2. If Foo is empty, save the new Foo document 3. If Foo is not empty, do not save the new Foo document

I'm calling the save method, addFoo(), from routes/index.js.

// 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:


This will work as follows ...

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

However if you want to pass it to parent as per your actual requirement, then you can try it as below ....

 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:


Short answer: You don't.

The callback gets executed after the addFoo function ends. You'd basically put the rest of your function inside the callback.

Since you need access to this, you can bind it to a variable via var self = this; and then use self inside the callback.

Another option is to use promises and a denodeify function that turns a callback requesting function into a Promise returning function.



来源:https://stackoverflow.com/questions/33114479/how-to-pass-a-result-from-inside-callback-out-into-its-parent-function

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!