Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/436.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
Javascript nodej编写同步函数,例如fs.readFileSync_Javascript_Node.js_Synchronous - Fatal编程技术网

Javascript nodej编写同步函数,例如fs.readFileSync

Javascript nodej编写同步函数,例如fs.readFileSync,javascript,node.js,synchronous,Javascript,Node.js,Synchronous,我想创建从数据库获取数据的函数,例如executeQuery(sql)。但我不希望从这个函数返回任何承诺,也不希望传递任何回调函数。我只想返回查询的结果 例如: var rows = executeQuery('SELECT * FROM table'); console.log('database query completed:', rows); 我知道javascript不是这样工作的。我也问了很多同样想要这个东西的问题。但每个人都说没有办法做到这一点 现在是我的问题如果这不可能,那么像

我想创建从数据库获取数据的函数,例如
executeQuery(sql)
。但我不希望从这个函数返回任何承诺,也不希望传递任何回调函数。我只想返回查询的结果

例如:

var rows = executeQuery('SELECT * FROM table');
console.log('database query completed:', rows);
我知道javascript不是这样工作的。我也问了很多同样想要这个东西的问题。但每个人都说没有办法做到这一点


现在是我的问题如果这不可能,那么像
fs.readFileSync()
这样的函数是如何工作的。这些函数既不需要任何回调,也不返回任何承诺。它们只是执行定义的操作。

您可以使用async/wait。这将为您提供与readFileSync几乎相同的语法,即没有承诺链或回调

var rows = await executeQuery('SELECT * FROM table')
console.log('database query completed:', rows) // this now works
您只需将其包装在异步函数中即可


只是为了避免混淆。该函数仍然是异步的,它的语法使代码更容易阅读。

Sync是同步的,在完成之前会阻止执行。fs的Sync方法将其结果作为返回值返回

其他fs非同步方法是异步的,在后台运行时会立即返回。您传递了一个回调函数,当它们完成时将被调用

当你开始使用Javascript时,承诺有点像噩梦,但因为Javascript只有一个线程,一旦你习惯了,它们就是Javascript之美的一部分。如果使用同步函数,则会阻止线程,这通常不是一个好主意,尤其是在不使用worker的情况下

我写了一篇帖子,如果你想在这里查看的话,我会把你的承诺包装起来


更新:正如@Paulpro在评论中所说,下面的答案永远不会起作用,因为代码将卡在无限循环中。所以你最好带着承诺去


我建议像“快乐机器”和“柏格”,最好使用承诺。但是如果您想知道
fs.readFileSync()
是如何工作的,那么请阅读

你会发现它做了一个
do{}while()
,你也可以做同样的事情 要像这样同步异步代码

var行;
executeQuery('SELECT*FROM table')。然后(
PromiserResponse=>{
行=PromiserResponse
}
)
做{
//没什么
}而(!rows)//未定义行
log('数据库查询已完成:',行);
fs.readFileSync()可以是同步的,因为它只与本地文件系统一起工作,这可能是一个快速操作。如果您的数据库是本地的,那么也可以将其编写为同步的。但是,如果您的数据库位于网络上,executeQuery将不得不发送http请求并等待响应,这可能需要很长时间,并且由于以下原因可能无法同步执行:


注意:从Gecko 30.0(Firefox 30.0/Thunderbird 30.0/SeaMonkey 2.27)开始,由于对用户体验的负面影响,主线程上的同步请求已被弃用。

等待关键字只能在声明为异步的函数中使用。这就是为什么我想知道
fs.readFileSync()
是如何工作的。它是通过在JavasScript:Check out:中阻塞事件循环来工作的,只需注意nodeJS中的设计理念是让它无阻塞。所以你会改变这种设计模式。对不起。但这不是我要问的。我知道如何使用承诺和回扣。但我不想用它们,但你不能真正避开它们。。javascript的全部要点是它是异步的。从数据库获取数据时不能阻止线程。而你却因为我试图帮助你看到这一点而拒绝我!如果您编写的代码是同步构建的,那么web实际上就无法工作。如果您坚持阻止线程,那么存在同步mysql库,您将无法对大多数提供阻止方法的库进行同步调用。。这是一个不好的做法。这有一个无限循环,它不会修改
,它永远无法到达console.log行。我将答案、函数编辑为arrow函数,这将更改行。arrow函数永远不会运行,因为有一个无限循环正在运行。只需尝试
var rows;setTimeout({rows=true;},100);do{}while(!行);console.log(“从未到达”)
来理解我的意思。你可以使用