Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用node async获取mongoose调用?_Javascript_Node.js_Mongodb_Asynchronous_Mongoose - Fatal编程技术网

Javascript 如何使用node async获取mongoose调用?

Javascript 如何使用node async获取mongoose调用?,javascript,node.js,mongodb,asynchronous,mongoose,Javascript,Node.js,Mongodb,Asynchronous,Mongoose,我正在用node/express/mongoose构建一个站点,在查看提交时,它需要执行以下操作 我遇到的问题是以非串行方式进行db获取。例如,我将执行一些调用来获取一些数据,但有些调用可能在执行上下文转到另一个上下文之前不会完成。尝试使用npm模块async,但在尝试如何集成它时遇到了问题 这是我的密码: var getViewCount = function(submissionId) { Submission.getSubmissionViewCount({ submissio

我正在用node/express/mongoose构建一个站点,在查看提交时,它需要执行以下操作

我遇到的问题是以非串行方式进行db获取。例如,我将执行一些调用来获取一些数据,但有些调用可能在执行上下文转到另一个上下文之前不会完成。尝试使用npm模块async,但在尝试如何集成它时遇到了问题

这是我的密码:

var getViewCount = function(submissionId) {
  Submission.getSubmissionViewCount({
    submissionId : submissionId
  }, function(err, count) {
    if (err) {
      throw err;
    }

    if (count) {
      return count;
    }
  });
};

var getVotes = function(submissionId) {
  console.log('getvotes');
  Submission.getSubmissionVotes({
    submissionId : submissionId
  }, function(err, votes) {
    return votes;
  });
};

var getSubmission = function(id) {
  Submission.getSubmission({
    id : id
  }, function(err, submission) {
    if (err) {
      throw err;
    }

    if (submission) {
      return submission;
    }
  });
};

var renderSubmission = function(title, submission, views) {
  res.render('submission', {
      title: submission.title + ' -',
      submission: submission,
      views: views.length
  });
};
如何将其用于async?或者我应该使用
async.series
isntead的
async.async

async.series([
  function(callback) {
    var submission = getSubmission(id);
    callback(null, submission);
  },
  function(callback) {
  //  getViewCount(submissionId);
  },
  function(callback) {
//    getVotes(submissionId);
  },
  function(callback) {
    //renderSubmission(title, submission, views);
  }
  ], function(err, results) {
    console.log(results);
  });

基本上,我想先获取视图和投票,然后提交我的提交。

大脑对您应该对代码进行的整体结构更改的描述是准确的。Node中的基本方法是嵌套一系列回调;您很少需要实际返回值的函数。相反,您可以定义一个函数,该函数将回调作为参数,并将结果传递给该回调。请查看下面的代码以进行说明(其中,
cb
是回调函数):


例如,
getSubmission
函数中的返回不会从
Submission.getSubmission
的回调返回任何内容。您需要沿着submissionId参数给它一个回调,并在db回调中而不是
返回提交
让它
回调(提交)
您看过async的队列方法吗?总的想法是@TheBrain和RobertMitchell所建议的。回调函数是键。过去,我使用queue、drain和forEach(用于db调用列表)方法成功地对MS SQL server进行了异步调用。尝试寻找基于承诺的解决方案:@TheBrain good call Thank。啊,是的,这个回调汤在一段时间后变得非常松散,但作为最后一个参数抛出回调效果很好。我会一直坚持下去,直到找到更好的方法。谢谢
var getViewCount = function(submissionId, cb) {
    Submission.getSubmissionViewCount({
        submissionId : submissionId
    }, function(err, count) {
        if (err) {
            throw err;
        }

        if (cb) {
            cb(count);
        }
    });
};

var getVotes = function(submissionId, cb) {
    console.log('getvotes');
    Submission.getSubmissionVotes({
        submissionId : submissionId
    }, function(err, votes) {
        if (cb) {
            cb(votes);
        }
    });
};

var getSubmission = function(id, cb) {
    Submission.getSubmission({
        id : id
    }, function(err, submission) {
        if (err) {
            throw err;
        }

        if (cb) {
            cb(submission);
        }
    });
};

var renderSubmission = function(submissionId) {

    getSubmission(submissionId, function (submission) {
        if (!submission) {
            // unable to find submission
            // add proper error handling here
        } else {
            getViewCount(submissionId, function (viewCount) {
                res.render('submission', {
                    title: submission.title + ' -',
                    submission: submission,
                    views: viewCount
                });
            });
        }
    };
};