Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js Nodejs函数被多次调用_Node.js - Fatal编程技术网

Node.js Nodejs函数被多次调用

Node.js Nodejs函数被多次调用,node.js,Node.js,我正在nodejs中开发一个解析器。因此,我请求一个网站并解析HTML。 我正在使用require(“htmlparser”)和require('follow-redirects').http处理请求 requestSite(options); console.log("Done\n"); parser.done(); function requestSite(options) { http.get(options, function(res) { console.log("Got r

我正在nodejs中开发一个解析器。因此,我请求一个网站并解析HTML。 我正在使用require(“htmlparser”)和require('follow-redirects').http处理请求

requestSite(options);
console.log("Done\n");
parser.done();

function requestSite(options) {
http.get(options, function(res) {
    console.log("Got response: " + res.statusCode);
    res.setEncoding('utf8');
    res.on('data', function (chunk) {
            parser.parseChunk(chunk.toString('utf8'));
    });
}).on('error', function(e) {
    console.log("Got error: " + e.message);
});
}
我现在的问题是,在requestSite函数实际完成其块之前调用done(),导致以下错误:

在调用done()后不允许在没有 调用重置()


我怎样才能等待块完成呢?

您没有考虑nodej的异步特性。它将调用
requestSite
,然后继续执行下一条语句,并在执行
requestSite
之前调用
parser.done
。改为这样做

requestSite(options, parser);
console.log("Done\n");

function requestSite(options, parser) {
http.get(options, function(res) {
    console.log("Got response: " + res.statusCode);
    res.setEncoding('utf8');
    res.on('data', function (chunk) {
            parser.parseChunk(chunk.toString('utf8'));
    })
    .on("end", function(){
          parser.done();
      })
}).on('error', function(e) {
    console.log("Got error: " + e.message);
});
}

您没有考虑nodejs的异步特性。它将调用
requestSite
,然后继续执行下一条语句,并在执行
requestSite
之前调用
parser.done
。改为这样做

requestSite(options, parser);
console.log("Done\n");

function requestSite(options, parser) {
http.get(options, function(res) {
    console.log("Got response: " + res.statusCode);
    res.setEncoding('utf8');
    res.on('data', function (chunk) {
            parser.parseChunk(chunk.toString('utf8'));
    })
    .on("end", function(){
          parser.done();
      })
}).on('error', function(e) {
    console.log("Got error: " + e.message);
});
}

这是node.js和事件驱动架构的基础

节点不是像php、python等那样的逐行编程

看看这个简单的例子:

console.log(1);
setTimeout (function(err, res) {
    console.log(2);
}, 0);
console.log(3);
正如您所想,它应该打印:1,2,3

但这将打印1,3,2

在您的示例中,您应该移动

 parser.done();
到http请求的“末尾”。 目前,您有一个获取数据块的事件,因此只需使用:
oned或类似的东西,然后放置“parser.done()”

这是node.js和事件驱动架构的基础

节点不是像php、python等那样的逐行编程

看看这个简单的例子:

console.log(1);
setTimeout (function(err, res) {
    console.log(2);
}, 0);
console.log(3);
正如您所想,它应该打印:1,2,3

但这将打印1,3,2

在您的示例中,您应该移动

 parser.done();
到http请求的“末尾”。 目前,您有一个获取数据块的事件,因此只需使用: ONED或类似的东西,然后放置“parser.done()”

是否有可以调用它的on('end')事件?是否有可以调用它的on('end')事件?