2013-03-08 51 views
0

我從我的路由中獲取請求參數例如mydomain.com/topic/animals其中requestParam = req.params.topicName,在這種情況下,animals。通過包含所有可能的話題對象嘗試異步執行在node.js中使用MongoDB查找時遇到問題

我循環,然後如果我找到相匹配的requestParam,然後我要執行到數據庫的調用返回的所有集合爲話題topicName

問題是它正在同步執行,因爲它總是會執行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 
    }); 
    } 
}); 

回答

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

請注意,我不確定我是否正確地重寫了每個對象。檢查這個。 :)

+0

啊哈......好吧,這需要一些習慣,但我現在終於可以開始了。這完全工作,順便說一句。謝謝! :d – 2013-03-08 11:20:50

相關問題