这是我所拥有的:
- 一个执行长时间(2-10 秒)计算(db + 外部 API 调用)的 Node.js 函数。我
async.auto()
用来组织调用的依赖项 - HTML 视图页面上一个漂亮的视觉进度条
- 调用查询的 getJSON 函数(参见下面的代码)
现在,我只是在更新计时器上的进度条。但我希望它更准确。我已经将服务器端功能分解为 5 个里程碑(即在每个外部调用成功完成之后),我想将该进度信息发送给客户端。但是,一旦您res.send(progress)
完成了回复,就无法再发送任何内容了。
我显然需要一个不同的模式,我有一些想法:
- 2个ajax调用,一个轮询进度,第二个得到结果
- 一个调用被调用 5 次,直到服务器端函数消失
- 完全不同的东西(可能是长轮询,websockets,?)
问题:
我想知道推荐的模式是什么,以及如何在服务器端和客户端实现它。非常感谢示例代码或示例链接!
而且,一如既往,感谢您的宝贵时间!
这里包括的是我到目前为止的代码(有明显的功能遗漏)。回答这个问题并不是绝对必要的,但我在这里提供它是为了提供一些背景信息。
客户
var searchFunction = function() {
var user = $("#searchTerm").val();
$.getJSON("/search/" + user, function(data) {
console.log(data);
ko.applyBindings(new MyViewModel(data));
});
$("#content").hide();
progressBar(5);
$("#progress_bar").show();
setTimeout(function() {
progressBar(25);
}, 1000);
setTimeout(function() {
progressBar(50);
}, 2000);
setTimeout(function() {
progressBar(75);
}, 3000);
setTimeout(function() {
$("#progress_bar").hide();
$("#content").show();
}, 4000);
};
服务器
var searchFunction = function(req, res) {
async.auto({
f1: function(callback) {
//things happen
callback(err, res);
},
f2: function(callback) {
//things happen
callback(err, res);
},
f3: ['f2', function(callback, result) {
//many things happen
callback(err, res);
},
function(err) {
//decisions are made
callback(null, watchers);
}]
}, function(err, result) {
//more exciting stuff happens
res.send(finalResults);
}
);
};