nodejs写同步函数eg fs.readFileSync

nodejs write synchronous functions eg fs.readFileSync

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

例如:

var rows = executeQuery('SELECT * FROM table');
console.log('database query completed:', rows);

我知道这不是 javascript 的工作方式。我也经历了一些也想要这个东西的 Whosebug 问题。但是大家都说没办法。

现在这是我的问题 如果这不可能,那么像 fs.readFileSync() 这样的函数是如何工作的。这些函数既不需要任何回调,也不需要 return 任何承诺。他们只是做他们被定义要做的事情。

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

var rows = await executeQuery('SELECT * FROM table')
console.log('database query completed:', rows) // this now works

您只需将其包装在异步函数中即可。

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

Sync 是同步的,会阻塞执行直到完成。 fs 的 Sync 方法 return 它们的结果为 return 值。

其他 fs 非同步方法是异步的,并且 return 在后台运行时立即执行。您传递一个回调函数,该函数在完成时被调用。

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

我写了一篇 post 关于让你了解 promises 的文章,如果你想在这里查看的话

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


我建议@happy-machine 和@bergur,最好使用Promises。但是如果你想知道 fs.readFileSync() 是如何工作的,那就去阅读 fs module code in nodejs source code.

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

var rows;
executeQuery('SELECT * FROM table').then(
  promiseResponse => {
   rows = promiseResponse
  }
)
do {
  // nothing
} while(!rows) // rows is undefined
console.log('database query completed:', rows);

fs.readFileSync() 可以是同步的,因为它只使用您的本地文件系统,这可能是一个快速操作。如果你的数据库是本地的,它也可以被写成同步的。但是,如果您的数据库在网上,executeQuery 将不得不发送一个 http 请求并等待响应,这可能需要很长时间,并且由于以下原因可能无法同步执行:

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