在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問(wèn)答/HTML/ ctx.render()加載頁(yè)面需要等后續(xù)執(zhí)行全部結(jié)束才會(huì)顯示最終結(jié)果嗎?

ctx.render()加載頁(yè)面需要等后續(xù)執(zhí)行全部結(jié)束才會(huì)顯示最終結(jié)果嗎?

想要實(shí)現(xiàn)的的業(yè)務(wù)是先渲染頁(yè)面,然后通過(guò)ctx.body往頁(yè)面中加內(nèi)容

核心代碼如下

await ctx.render('crawler', {
    title: '爬取頁(yè)面',
    content: `<h2>開(kāi)始爬取</h2>
                <h4>創(chuàng)建地址池成功!</h4>`
})
const linkPool = createLinkPool()
for (let i = 0; i < linkPool.length; ++i) {
    const html = await requestPage(linkPool[i])
    let builds = await dataHandler(html)
    let arr = [];

    const sql = 'insert into buildinfo(id,name,area,address,average,price,description,type) values ?'
    //let rows = await query(sql, [builds])
    try {
        let rows = await query(sql, [builds])
        ctx.body += `爬取地址${linkPool[i]}的${rows.affectedRows}條數(shù)據(jù)已經(jīng)入庫(kù)`

    } catch (error) {
        ctx.body += `${linkPool[i]}的爬取寫(xiě)入操作失敗了!失敗原因:${error}`
    }
}

現(xiàn)在的問(wèn)題是只有當(dāng)所有寫(xiě)數(shù)據(jù)庫(kù)的操作結(jié)束,頁(yè)面才會(huì)展示,否則一直在讀小圓圈,請(qǐng)問(wèn)怎么才能達(dá)到我所預(yù)期的效果


我將渲染頁(yè)面之后的操作放到一個(gè)中間件中了,代碼如下

router.get('/crawler/', async (ctx, next) => {
    await ctx.render('crawler', {
        title: '爬取頁(yè)面',
        content: `<h2>開(kāi)始爬取</h2>
                    <h4>創(chuàng)建地址池成功!</h4>`
    })
    next()
})

頁(yè)面渲染之后也確實(shí)執(zhí)行了入庫(kù)操作的邏輯,但是

ctx.body += `爬取地址${linkPool[i]}的${rows.affectedRows}條數(shù)據(jù)已經(jīng)入庫(kù)`

這個(gè)操作并沒(méi)有往頁(yè)面上寫(xiě)內(nèi)容,是不是我的用法不對(duì),請(qǐng)問(wèn)ctx.body是干什么的?

回答
編輯回答
遲月

你的這個(gè)需求,最好的方法就是前后端分離

前端有個(gè)靜態(tài)頁(yè)面,然后請(qǐng)求后臺(tái)的接口數(shù)據(jù)填充頁(yè)面就可以了

ctx.body 方法 是往前端返回?cái)?shù)據(jù)相當(dāng)于response.body的內(nèi)容

2017年9月15日 09:57
編輯回答
你好胸

你都await query了當(dāng)然是讀完再返回。
如果你需要先渲染一遍,再填充數(shù)據(jù),只能在前端寫(xiě)腳本訪問(wèn)后端接口,因?yàn)?code>http不能主動(dòng)寫(xiě)數(shù)據(jù)。

2017年9月8日 07:45
編輯回答
吢涼

你需要的應(yīng)該bigpipe的思路去實(shí)現(xiàn)。分段的返回內(nèi)容。具體的實(shí)現(xiàn)方式自己去搜索怎么結(jié)合你的實(shí)現(xiàn)

2017年2月3日 08:02