【问题标题】:How come both console.log() execute when there is a condition to prevent such a thing from happening?当有条件阻止这种事情发生时,console.log() 怎么会执行?
【发布时间】:2018-03-21 05:03:37
【问题描述】:

我正在尝试使用以下代码启动应用程序后自动启动 MySQL 服务器:

var exec = require('child_process').exec;

let check = new Promise((resolve, reject) =>
  exec('mysql-ctl status', function(error, stdout, stderr) {
    if (error)
      reject(error);
    else
      resolve(stderr);
  })
);

let start = new Promise((resolve, reject) =>
  exec('mysql-ctl start', function(error, stdout, stderr) {
    if (error)
      reject(error);
    else
      resolve(console.log("MySQL server is up!"));
  })
);

async function check_status() {
  return await check;
}

async function start_server(status) {
  if (status.trim() == 'MySQL is stopped') {
    console.log("Starting MySQL server...");
    await start;
  } else console.log("MySQL server was up...");
}

module.exports = async function() {
  check_status()
    .then((status) => start_server(status))
    .catch((error) => console.log("Error: " + error));
};

但是,如果服务器已经启动,我会得到以下输出:

App Started. Listening on PORT 8080
MySQL server was up...
MySQL server is up!

当有一个条件可以防止这种情况发生时,为什么两个 console.log() 都在执行?

【问题讨论】:

  • 因为您创建了一个始终运行的承诺,无论如何。 IOW:这段代码总是执行 -> let start = new Promise((resolve, reject) =>
  • @Keith 谢谢!那么我如何构建一个以后运行它的承诺呢?像这样:function start() { return new Promise(function(resolve, reject) {}) } ?
  • 只需将start 变成一个返回promise 的函数.. 例如.. function start() { return new Promise...... ,然后调用await start()..

标签: javascript mysql node.js asynchronous async-await


【解决方案1】:

当您调用new Promise(resolve, reject => ()) 时,您将开始执行赋予promise 的函数。该函数是异步执行的。

因此,在您的情况下,您开始检查 MySQL 是否正在运行,然后启动用于启动 MySQL 的脚本,但在检查完成之前。

module.exports = async function() {
  check_status()
    .then((status) => start_server(status))
    .catch((error) => console.log("Error: " + error));
};

当这个函数被执行时,你只是在等待checkcheck_status() 中的结果。但该检查是在创建 check 变量时开始的。

此结果在您的 then 方法中 => MySQL server is up!。当 check 正在执行时, start 也正在执行,因为 MySQL 服务器没有启动,你得到 Starting MySQL server...

【讨论】:

    猜你喜欢
    • 2021-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多