javascript - node.js - 互变量

标签 javascript node.js concurrent-programming

我是 node.js 的新手,所以在发布我的 node.js 应用程序之前,我需要确保它能正常工作。

假设我有一个数组变量,我在脚本的开头初始化了它

myArray = [];

然后我从外部 API 提取一些数据,将其存储在 myArray 中,并使用 setInterval() 方法每 30 分钟再次提取此数据:

pullData();
setInterval(pullData, 30*60*1000);

pullData() 函数大约需要 2-3 秒才能完成。

客户端将能够使用此函数获取 myArray:

http.createServer(function(request, response){
var path = url.parse(request.url).pathname;
if(path=="/getdata"){

    var string = JSON.stringify(myArray);
    response.writeHead(200, {'Content-Type': 'text/plain'});
    response.end(string);              

}
}).listen(8001);

所以我要问的是,下一种情况会发生吗?: 客户端试图从这个 node.js 服务器获取数据,并且在同一时刻,数据被 pullData() 函数写入 myArray,导致无效数据被发送到客户端?

我阅读了一些文档,我意识到当 pullData() 运行时,createServer() 在 pullData() 完成其工作之前不会响应客户端? 我真的不擅长并发编程,所以我需要您对此进行确认,或者您是否有更好的解决方案?

编辑:这是我的 pullData() 函数的代码:

 var now = new Date();

Date.prototype.addDays = function(days){

        var dat = new Date(this.valueOf());
        dat.setDate(dat.getDate() + days);
        return dat;
}


var endDateTime = now.addDays(noOfDays);
var formattedEnd = endDateTime.toISOString(); 

var url = "https://api.mindbodyonline.com/0_5/ClassService.asmx?wsdl";
    soap.createClient(url, function (err, client) {
        if (err) {
            throw err;
        }

        client.setEndpoint('https://api.mindbodyonline.com/0_5/ClassService.asmx');
        var params = {
            "Request": {
                "SourceCredentials": {
                    "SourceName": sourceName,
                    "Password": password,
                    "SiteIDs": {
                        "int": [siteIDs]
                    }
                },
                "EndDateTime" : formattedEnd

            }
        };


client.Class_x0020_Service.Class_x0020_ServiceSoap.GetClasses(params, function (errs, result) {
            if (errs) {
                console.log(errs);
            } else {

                    var classes = result.GetClassesResult.Classes.Class;
                    myArray = [];

                    for (var i = 0; i < classes.length; i++) {
                        var name = classes[i].ClassDescription.Name;
                        var staff = classes[i].Staff.Name;
                        var locationName = classes[i].Location.Name;
                        var start = classes[i].StartDateTime.toISOString();
                        var end = classes[i].EndDateTime.toISOString();
                        var klasa = new Klasa(name,staff,locationName,start,end);

                        myArray.push(klasa);
                    }

                    myArray.sort(function(a,b){
                        var c = new Date(a.start);
                        var d = new Date(b.start);
                        return c-d;
                    });

                    string = JSON.stringify(myArray);
     }
        })


    });

最佳答案

不,NodeJs 不是多线程的,一切都在单线程上运行,这意味着除了非阻塞调用(即 IO)之外,其他一切都会占用 CPU 直到它返回,而 NodeJS 绝对不会中途返回向最终用户填充数组,只要您只执行一个 HTTP 调用来填充您的数组

更新: 正如@RyanWilcox 所指出的那样,任何异步(非阻塞系统调用)调用都可能会提示 NodeJS 解释器让您的函数执行一半并稍后返回。

关于javascript - node.js - 互变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34382809/

相关文章:

java - ConcurrentHashMap 返回一个弱一致性迭代器,我们为什么要使用它呢?

javascript - 将数字作为字符串进行加法和减法

javascript - 在 Node.js 中循环写入文件时可能出现数据不一致

javascript - 上传图片时出现错误 413 有效载荷太大

node.js - NPM 包安装后运行 gulp 任务

multithreading - 共识值(value)

java - 阻塞锁与非阻塞锁

java - 需要在页面加载时全屏显示托管的 html 页面

javascript - d3.select(this) 返回什么?

JavaScript 将文本替换为文本中每个匹配项的函数结果