我对 Promise 非常陌生,我有以下代码:
const cintTotalRequests = 25000;
var blnNext = true, intRequest = 0;
do {
if ( blnNext != true ) {
continue;
}
blnNext = false;
info.msg("Request#" + (++intRequest));
info.msg("Creating promise");
var myPromise = new Promise(function(myResolve, myError) {
const cstrURI = "http://localhost:8000/"
+ "?cn=Tesla&cy=2024&cm=1&cd=8&ds=clickcomp&rt=10&u=1";
http.get(cstrURI, res => {
let data = [];
const headerDate = res.headers
&& res.headers.date
? res.headers.date : 'no response date';
info.msg('Status Code:', res.statusCode);
info.msg('Date in Response header:', headerDate);
res.on("data", chunk => {
data.push(chunk);
});
res.on('end', () => {
info.msg('Response ended: ');
myResolve(data);
});
}).on("error", err => {
var strMsg = "ERROR:" + err.message;
info.msg(defs.RED + strMsg + defs.RESET);
myError(strMsg);
});
});
myPromise.then(function(data) {
console.log("myPromise.resolve(" + data + ")");
}, fnError = function(strError) {
console.log("myPromise.reject(" + strError + ")");
});
break;
} while( intRequest < cintTotalRequests );
据我所知,http.get 上的回调未被调用,我已将 console.log 放入回调中以查看其操作,但不是,任何人都可以提供帮助,因为我知道请求服务器没有接收到它,因为它也在我的系统上运行并启用了调试。
在 while 循环中使用 break,它适用于一次迭代,我需要学习如何实现 await。
核心问题 - 这不是 Node.js 的工作方式。它有一个叫做Eventloop的东西,原理非常简单。它只有一个线程来执行你的代码(实际上有一个用于 I/O 操作的线程池,但这对你来说是不可见的)。 Eventloop 在“顶部”接收事件,在某些时候,它是您发布的代码并执行它拥有的所有同步上下文。
因此,在执行回调
do-while
之前,http.get(cstrURI, res => {
始终会首先完全执行,因为它是应用程序的同步部分(即使它运行了几个小时)。
如果您需要先等待 Promise 完成,则需要从应用程序的这一部分返回它,并在某处编写
myPromise.then(...)
并将您想要的任何内容放入 .then 部分