JavaScript,Promise,有什么问题吗?

问题描述 投票:0回答:1

我对 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 promise
1个回答
1
投票

核心问题 - 这不是 Node.js 的工作方式。它有一个叫做Eventloop的东西,原理非常简单。它只有一个线程来执行你的代码(实际上有一个用于 I/O 操作的线程池,但这对你来说是不可见的)。 Eventloop 在“顶部”接收事件,在某些时候,它是您发布的代码并执行它拥有的所有同步上下文。

因此,在执行回调

do-while
之前,
http.get(cstrURI, res => {
始终会首先完全执行,因为它是应用程序的同步部分(即使它运行了几个小时)。

如果您需要先等待 Promise 完成,则需要从应用程序的这一部分返回它,并在某处编写

myPromise.then(...)
并将您想要的任何内容放入 .then 部分

© www.soinside.com 2019 - 2024. All rights reserved.