【发布时间】:2021-04-23 09:54:32
【问题描述】:
我是 JS 和 Node.js 的新手。我昨天才开始学习它,所以我可能没有以正确的方式做事。
我有一个 NodeJS 应用程序,我使用 express 建立了一个服务器。客户端将向该服务器发出获取请求,服务器将执行一些 API 调用/计算,然后当结果准备好时,服务器会将结果发送回客户端。这就是我现在拥有的
app.mjs
app.get('/log', function (req, res) {
...
function callback(data) {
res.send(data);
}
deviceHandler.getLog(filteredDevices, callback);
}
)
还有 deviceHander.mjs
class DeviceHandler {
...
getLog(device, callback) {
var handler = this.deviceHandlers[device.type]
handler.getLog(device, callback)
}
}
其中一个设备是 iPhone,所以这里是 iphoneDeviceHandler.mjs 的 sn-p
IphoneDeviceHandler.prototype.getLog = function(device, callback) {
get(url, callback);
};
终于来了我的get函数
function get(url, callback, method='GET') {
var http = new XMLHttpRequest();
http.open(method, url, true);
...
http.onload = function() {
if (http.status != 200) {
callback(`Error ${http.status}: ${http.statusText}`);
} else { // show the result
// callback(http.responseText) <--- this freeze
console.log(Buffer.byteLength(http.responseText, "utf-8")); <-----1323196 bytes so 1.3 MB but sometimes it can be up to 5MB
}
};
http.send();
}
这可行,但我认为我做错了什么,因为我的终端在我拨打一个电话后一直冻结所有内容。以下是问题
- 在我向本地主机服务器发出请求后,终端冻结。不确定为什么,但我怀疑这与我的回调函数有关?它是在我添加回调后开始的。
- 获取日志操作需要一段时间,这就是我使用同步调用
http.open(method, url, false);的原因。那样可以么?我听说同步在 JS 世界中通常是不受欢迎的? (我再次对它超级陌生)或者我应该执行异步操作,但是如何在 app.mjs 中调用 res.send() 之前将响应返回给客户端? - 推荐的返回进度的方法是什么?
【问题讨论】:
标签: javascript node.js express asynchronous xmlhttprequest