gpt4 book ai didi

node.js - 异步并行请求 - 部分渲染

转载 作者:搜寻专家 更新时间:2023-10-31 23:06:17 25 4
gpt4 key购买 nike

在异步并行请求之后部分呈现 View 的正确方法是什么?

目前我正在做以下事情

// an example using an object instead of an array
async.parallel({
one: function(callback){
setTimeout(function(){
callback(null, 1);
// can I partially merge the results and render here?
}, 200);
},
two: function(callback){
setTimeout(function(){
callback(null, 2);
// can I partially merge the results and render here?
}, 100);
}
},
function(err, results) {
// results is now equals to: {one: 1, two: 2}
// merge the results and render a view
res.render('mypage.ejs', { title: 'Results'});

});

它基本上工作正常,但是,如果我有一个 function1, function2, ..., functionN View 将仅在最慢的函数完成时呈现。

我想找到正确的方法,以便能够在第一个函数返回时立即呈现 View ,以最大限度地减少用户延迟,并在函数结果可用时立即添加。

最佳答案

你要的是facebook的bigpipe:https://www.facebook.com/note.php?note_id=389414033919 .幸运的是,这对于 nodejs 来说很容易,因为流是内置的。不幸的是,模板系统在这方面很糟糕,因为异步模板很麻烦。但是,这比执行任何额外的 AJAX 请求要好得多。

基本思路是先发送布局:

res.render('layout.ejs', function (err, html) {
if (err) return next(err)

res.setHeader('Content-Type', 'text/html; charset=utf-8')
res.write(html.replace('</body></html>', ''))

// Ends the response.
// `writePartials` should not return anything in the callback!
writePartials(res.end.bind(res, '</body></html>'))
})

你不能发送</body></html>因为你的文档还没有完成。然后writePartials将是一堆并行执行的异步函数(partials 或 pagelets)。

function writePartials(callback) {
async.parallel([partial1, partial2, partial3], callback)
})

注意:由于您已经编写了回复,因此除了记录错误之外,您对错误无能为力。

每个部分将做的是将内联 javascript 发送到客户端。例如,布局可以有 .stream , 小页面将替换 .streaminnerHTML到达时,或“回调完成”时。

function partialStream(callback) {
res.render('stream.partial.ejs', function (err, html) {
// Don't return the error in the callback
// You may want to display an error message or something instead
if (err) {
console.error(err.stack)
callback()
return
}

res.write('<script>document.querySelector(".stream").innerHTML = ' +
JSON.stringify(html) + ';</script>')
callback()
})
})

就我个人而言,我有 .stream.placeholder并将其替换为新的 .stream元素。原因是我基本上做.placeholder, .placeholder ~ * {display: none}所以事情不会在页面上跳来跳去。但是,这需要DIY前端框架,因为突然间JS变得更加复杂。

现在,您的回复正在流式传输。唯一的要求是客户端支持 Javascript。

关于node.js - 异步并行请求 - 部分渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16280917/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com