Async.waterfall函数被调用两次

时间:2017-07-15 14:11:08

标签: javascript node.js function asynchronous

我有一个异步瀑布数组,其中函数otherIngrLists()是要执行的第三个。之前的每个功能都运行良好。

function otherIngrLists(userslist, callback){
    collection = db.get('ingrList');
    collection.find({"userid":{$ne:userid}},{},function(err,docs){ 
      if(!err){
        var otherLists = docs;
        var otherListsCount = docs.count();
        console.log(otherListsCount);
        callback(null, otherLists, otherListsCount, userslist);
      } else {
          callback(err, null);
      }
   });
 },

问题是这个函数被调用了两次。我用一个简单的console.log()确认了这一点。

我是如何设法再次调用此功能的?当我使用它们传递给下一个函数时,我是否错误地回调了回调的概念?

此函数执行两次后,也会抛出错误。它对这个问题没有任何意义,我稍后会关注自己。 谢谢你的时间!

router.get中的瀑布数组:

router.get('/:userid', function(req, res) {
  var db = req.db;
  var collection;
  var userid = req.params.userid;

  async.waterfall(
[
  function getIngrList(callback, userid) {
    var route = 'http://localhost:3000/users/zutatenliste/'+userid;

    request(route, function(err, response, body){
      if (!err && response.statusCode === 200) {
        var userlist = body;
        callback(null, userlist);
      } else {
        callback(err, null);
        return;
      }
    });
  },

  function otherIngrLists(userlist, callback){
    collection = db.get('zutatenListe');
    console.log(userid);
    collection.find({"userid":{$ne:userid}},{},function(err,docs){  
      if(!err){
        var otherLists = docs;
        var otherListsCount = docs.count();
        callback(null, otherLists, otherListsCount, userlist);
      } else {
        callback(err, null);
      }
    });
  },

  function pushInArray(otherLists, otherListsCount, userlist, callback){
    console.log("test");
    ...
    ...}
     }
   }

编辑1: - 如果案件被执行,首先是真实的,然后是假的 - //不再发生了

编辑2:添加整个事物直到有问题的功能

2 个答案:

答案 0 :(得分:0)

请提供一些额外的详细信息,因为此功能看起来很完美,不,您没有误解您正确使用它的回调概念。

异步瀑布的结构

var create = function (req, res) {
        async.waterfall([
            _function1(req),
            _function2,
            _function3
        ], function (error, success) {
            if (error) { alert('Something is wrong!'); }
            return alert('Done!');
        });
    };

    function _function1 (req) {
        return function (callback) {
            var something = req.body;
            callback (null, something);
       }
    }

    function _function2 (something, callback) {
        return function (callback) {
           var somethingelse = function () { // do something here };
           callback (err, somethingelse);
        }
    }

    function _function3 (something, callback) {
        return function (callback) {
          var somethingmore = function () { // do something here };
          callback (err, somethingmore);
        }
   }

so, in waterfall you can pass the values to the next function and your 3rd function is correct.

被修改

  async.waterfall(
[
    //can not give userId as second parameter
  function getIngrList(callback) {
      //if you want userId you can pass as I shown above or directly use here if it's accessible
    var route = 'http://localhost:3000/users/zutatenliste/'+userid;

    request(route, function(err, response, body){
      if (!err && response.statusCode === 200) {
        var userlist = body;
        callback(null, userlist);
      } else {
        callback(err, null);
        // return; no need
      }
    });
  },

  function otherIngrLists(userlist, callback){
    collection = db.get('zutatenListe');
    console.log(userid);
    collection.find({"userid":{$ne:userid}},{},function(err,docs){  
      if(!err){
        var otherLists = docs;
        var otherListsCount = docs.count();
        callback(null, otherLists, otherListsCount, userlist);
      } else {
        callback(err, null);
      }
    });
  },

  function pushInArray(otherLists, otherListsCount, userlist, callback){
    console.log("test");
    ...
    ...}

如上所述,你无法在那里传递userId作为最后一个参数。如果您仍然遇到同样的错误,请告诉我。

答案 1 :(得分:0)

首先你需要声明你的功能:

function myFuntion(userId, callback) {
    async.waterfall([

        function(callback) {
            //do some thing here
            callback(null, userlist);
        }, function(userId, callback) {
            //do something here
            callback(null, orderList, orderListCount, userlist);
        }

    ], function(err, orderList, orderListCount, userlist) {
        if(err)
           console.log(err);
        else
           callback(orderList, orderList, userlist);
    })
}

之后你可以使用功能:

myFuntion(userId, function(orderList, orderListCount, userlist) {

    console.log(orderList);
    console.log(orderListCount);
    console.log(userlist);
})