2017-02-26 38 views
2

背景:一個Market集合有一個url屬性存儲的URL選自sitesSite集合數組。我創建了一個幫助器(代碼如下),我可以從/routes/markets.js調用該幫助器,它基本上選擇基於req.params.urlMarket,然後遍歷market.sites數組並找到相應的Site,將它們存儲到我可以在呈現視圖時使用的數組中。不能推到一個數組從貓鼬則聲明

問題:調用磁盤陣列上的push功能實際上並沒有任何推動,在過去console.log聲明我只需登錄[]

問題:我怎麼能推到這個數組?這是for of循環和thenPromise呼叫問題嗎?

市場helpers.js

exports.listSites = (req, res, errorRender, successRender) => { 
    let sites = []; 
    Market.find({url: req.params.url}) 
    .then((market) => { 
     for (url of market[0].sites) 
     Site.find({url}).then((site) => { 
      sites.push(site[0]); 
     }).catch((err) => console.log(err)); 

     console.log(sites); 
     res.render(successRender, {sites}); 
    }) 
    .catch((errors) => { 
     res.render(errorRender, {errors}); 
    }); 
}; 

路由/ markets.js

router.get('/:url', (req, res) => { 
    Markets.listSites(req, res, 'login-markets', 'markets/index'); 
}); 

回答

1

Site.find({url})是一個異步operaration因此res.send等待異步操作的結果之前執行。您可以等待使用Promise.all,一旦所有的這些都解決了所有異步操作的結果可以返回響應如下:

exports.listSites = (req, res, errorRender, successRender) => { 
    let sites = []; 
    Market.find({url: req.params.url}) 
    .then((market) => { 
     const promises = []; 
     for (url of market[0].sites) 
      promises.push(Site.find({url}).then((site) => sites.push(site[0]))); 

     return Promise.all(promises).then(() => { 
      console.log(sites); 
      res.render(successRender, {sites}); 
     }); 
    }) 
    .catch((errors) => { 
     res.render(errorRender, {errors}); 
    }); 
}; 
+0

這完美地工作!謝謝! – szier

+0

歡迎您:) – cubbuk