javascript - 如何在完成之前获取异步函数的状态?

标签 javascript node.js callback execfile

我正在使用 NodeJs execFile() 启动守护进程。我已将回调包装在 promise 中,以便在我的应用程序的其他部分异步使用它。

我理解回调在完成时发出错误/结果。所以当守护进程失败时,promise 会正确地拒绝错误。

问题:当守护进程正确启动时, promise 不会解决任何问题,因为回调尚未完成。

一旦守护进程停止,就会收到响应,因为那是回调生命周期的结束。但为时已晚。

问题:如何跟踪回调的生命周期让 promise resolve(callback_in_progress)?

我需要使用 Node 事件模块来创建事件监听器吗?

这是模块中的 2 个方法。第一个效果很好,但第二个是我遇到问题的地方。

const { execFile } = require('child_process');
const path = require('path');
const binaryPath = require('./BinaryPaths')

const mcUtil = path.join(binaryPath, 'multichain-util');
const mcd = path.join(binaryPath, 'multichaind');

module.exports = {
    createChain: (chainName) => {
        return new Promise((resolve, reject) => {
            execFile(mcUtil, ['create', chainName], (err, res) => {
               err ? reject(err) : resolve(res);
            });
        });
    },
    startMultichain: (chainName) => {
        return new Promise((resolve, reject) => {
           execFile(mcd, [chainName, 'daemon'], (err, res) => {
              err ? reject(err.message) : resolve(res);
           });
        });
     },
};

最佳答案

您可以围绕您的 Promise 创建一个包装器,以在您的代码中同步获取您的 promise 状态,如下所示:

class StatefulPromise extends Promise {
  constructor (executor) {
    super((resolve, reject) => executor(
      (val) => {
        resolve(val)
        this._state = 'Resolved'
      },
      (err) => {
        reject(err)
        this._state = 'Rejected'
      },
    ))
    this._state = 'Processing'
  }

  get state () {
    return this._state
  }
}
 
// Create a promise that resolves after 3 sec 
var myStatefulPromise = new StatefulPromise((resolve, reject) => {
  setTimeout(() => resolve(), 3000)
})

// Log the state of above promise every 500ms
setInterval(() => console.log(myStatefulPromise.state), 500)

关于javascript - 如何在完成之前获取异步函数的状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58296780/

相关文章:

python - Node与Python之间的通信

javascript - node.js 中的回调是始终异步还是始终同步?或者它们可以是 "sometimes one, sometimes the other"吗?

java - `CompletionHandler` 和 `CompletableFuture` 是 Java 中异步编程的两种不同方法吗?

javascript - REST API 最佳实践?返回空对象与无对象

ruby-on-rails - Ruby on Rails 内联 around_save 回调产生 LocalJumpError

javascript - 无法为 typescript 字典赋值

javascript - 在图层组中放置多个标记

javascript - 在 Salesforce 中使用 Apex 从 Excel 文件中读取数据

javascript - 将全局 try/catch 添加到 JavaScript

node.js - 谷歌模拟器上的操作不分离屏幕输出设备