0

我正在从我的路由中获取一个请求参数,例如mydomain.com/topic/animalswhererequestParam = req.params.topicName和在这种情况下,animals.

我遍历一个包含所有可能主题的对象,然后如果找到topicName与 匹配的requestParam,那么我想执行对数据库的调用以返回该主题的所有集合。

问题是它正在同步执行,因为它总是会执行else子句,例如

if (requestParam === topicName) {
  // fetch submission
} else {
  // return 404
}

所以它总是返回 404,但是如果我在这里去掉这个else子句,那么它就可以工作了。我查看了下划线_.after()但无法让它正常工作(甚至不确定这是否是我应该使用的?

我的代码:

_.each(topics, function(key, topic) {
  var topicName = key['topicName'],

  if (requestParam === topicName) {
    Submission.getTopicSubmissions({ topicName : topicName }, function(err, submissions) {
      if (err) {
        res.redirect('/');
      } else if (submissions) {
        res.render('topic', {
          submissions: submissions
        });
      } else {
        res.redirect('/topics');
      }
    });
  } else {
    res.render('errors/404', {
      title: 'Page Not Found -',
      status: 404,
      url: req.url
    });
  }
});
4

1 回答 1

0

问题是您不应该在每次迭代中渲染 404。因为您执行异步查找,所以它计划在未来某个时间点执行,而当前函数继续运行。毫无疑问,您将在某个时候遇到不同的情况并至少渲染一次 404。使用可破坏的迭代,在搜索时标记,并在迭代之外执行 404,如下所示:

var isWaitingForResult = false;
topics.every(function(topic, key) { // TODO: Check if this iterator matches _.each
    var topicName = key['topicName'],

    if (requestParam === topicName) {
      isWaitingForResult = true; // Wait for the result.
      Submission.getTopicSubmissions({ topicName : topicName }, function(err, submissions) {
        if (err) {
          res.redirect('/');
        } else if (submissions) {
          res.render('topic', {
            submissions: submissions
          });
        } else {
          res.redirect('/topics');
        }
      });
      return false; // stop iteration, we did start our search after all
    }
    return true; // continue iteration so we have another chance.
});
if (!isWaitingForResult) { // did a search NOT start?
    res.render('errors/404', {
      title: 'Page Not Found -',
      status: 404,
      url: req.url
    });
}

请注意,我不确定我是否正确地重写了每一个。检查这个。:)

于 2013-03-08T10:10:25.697 回答