Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.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_Asynchronous - Fatal编程技术网

Node.js nodejs-何时使用异步而不是同步函数?

Node.js nodejs-何时使用异步而不是同步函数?,node.js,asynchronous,Node.js,Asynchronous,我读过一些关于这种东西的文章。然而,我仍然陷入了一个困境。例如,我有两个功能: function getDataSync(){ var data = db.query("some query"); return JSON.stringify(data); } function getDataAsync(){ return db.query("some query",function(result){ return JSON.stringify(result

我读过一些关于这种东西的文章。然而,我仍然陷入了一个困境。例如,我有两个功能:

function getDataSync(){
    var data = db.query("some query");
    return JSON.stringify(data);
}
function getDataAsync(){
    return db.query("some query",function(result){
        return JSON.stringify(result);
    });
}
人们说在IO绑定中推荐使用
异步编程。然而,在这种情况下,我看不出有什么不同。
Async
one似乎更难看


我的观点有什么问题?

在第一个示例中,线程将在此时被阻塞,直到从数据库检索到数据

db.query(“一些查询”)

在第二个示例中,线程不会被阻塞,但它将可用于服务更多请求

{
  return JSON.stringify(result);
}
一旦数据库中的数据可用,就会调用此函数


这就是node.js被称为非阻塞IO的原因,这意味着您的线程永远不会被阻塞。

nodejs在默认情况下是异步的,这意味着它不会像在其他语言中那样按顺序执行您的语句

database.query("SELECT * FROM hugetable", function(rows) {
  var result = rows;
});
console.log("Hello World");
在另一种语言中,它将等待查询语句完成执行。 但在nodejs中,它将单独执行查询语句,并继续执行以将
Hello World
记录到屏幕上

所以当你说

function getDataSync(){
    var data = db.query("some query");
    return JSON.stringify(data);
}
它将在db.query返回数据之前返回数据

function getDataAsync(){
    return db.query("some query",function(result){
        return JSON.stringify(result);
    });
}
但在node.js中,作为参数传递的函数称为callback,这意味着只要
getDataAsync()
完成其执行,它就会调用


我们在nodejs中使用回调,因为我们不知道
db.query()
何时完成其执行(因为它们没有按顺序完成执行),但当它完成时,它将调用回调。

当某些操作阻止执行时,使用异步。这在多线程应用程序或服务器中不是问题。但是NodeJS是单线程应用程序,不应该被单个操作阻塞。如果它被
db.query(“某些查询”)之类的操作阻止,Node.js将等待完成它

它就像你在电饭锅前无所事事地站着,直到它煮熟。一般来说,你会在煮米饭的时候做其他的活动。当哨声响起时,你可以用米饭做任何事。类似地,NodeJS将向事件循环发送非同步操作,当操作结束时,事件循环将通知我们。同时Node.js可以处理其他操作,比如服务其他连接


你说的
难看
。异步并不意味着只使用
回调
。您可以使用或库

这就是承诺存在的原因:)谢谢,我明白你的意思了。顺便说一句,你的意思是我应该在每种情况下都使用
Async
?你对node.js有选择吗?如果线程被阻塞,但是
阻塞的时间量很小,那又如何呢?我可以用
Sync
而不是
Async
吗?既然你得到了两个答案,而没有人指出,我只需要说明第二个例子永远不会起作用。您也必须在自己的函数中使用回调:
function getDataAsync(callback){db.query(“一些查询”,function(result){callback(JSON.stringify(result));}}
(很抱歉内联格式)。我没有
console.log(“Hello World”)稍后。而且,我不需要知道查询何时完成。在这种情况下,我需要一个
异步函数吗?如果你使用node.js,你不能只放JSON.stringify(result);在这样的查询之后,因为您不知道db.query是否在JSON.stringify()开始执行之前完成执行(可能不知道,您将字符串化一个空变量)。因此需要回调。在nodejs中,当语句可以并行运行时,您将语句按顺序排列,这样您就不希望程序冻结并等待前一个语句执行。我明白您的意思。但是我觉得冻结的时间很短,,因为它仍然需要等待直到数据可用。通常在另一种语言中,即IO阻塞,如果冻结时间太长,您的程序无法执行任何其他操作,因此在某些情况下,当您有其他IO语句要执行时,NodeJ可以为您执行,因为它不会阻止您的请求,直到前一个请求完成,所以它可以更快。但是在某些情况下,对于ex,你不能这样做。你必须做一些复杂的计算,那么nodejs不会比其他编程语言更快。好的,nodejs的概念是,它使用一个线程来处理所有事情,并将一些IO工作(如数据库查询)抛给负责人,然后在他告诉他工作完成时返回。但是nodejs不能抛出一些他有责任喜欢的计算工作。整个想法是,通常当你做一些io时,你的cpu会变成空闲节点,他们只是想最大限度地利用cpu,这样他就不会等待别人的工作,而是更多地回来工作。请尝试以下链接:如果
等待时间
很小,会发生什么?在这种情况下,我需要
Async
吗?@user3828771无论花多少时间,只要等待,它都需要异步。它更多的是关于控制流,任务在一次完成的过程中不停地执行;如果它可以同步,但如果它中断并必须等待外部因素,那么它的异步。Node.js已决定包含同步函数,以保持与其他通用语言的相似性,但不应使用它们,决不,决不,决不!