【问题标题】:How to get the status of an async function before it's finished?如何在异步函数完成之前获取它的状态?
【发布时间】:2020-02-06 08:33:06
【问题描述】:

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

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

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

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

问题:如何跟踪回调的生命周期以让 Promise 解决(callback_in_progress)?

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

这些是模块中的 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);
           });
        });
     },
};

【问题讨论】:

  • 你能告诉我们你的代码吗?
  • 对不起...我第一次在这里发帖。
  • 我使用的二进制文件可以在这里找到multichain.com/download-community
  • @UtkarshPramodGupta 感谢您的解决方案。对不起,我没有回复。我仍在努力解决它……以及其他工作。我猜“执行者”是指内心的承诺?还是“执行者”指的是 execFile 回调?
  • 你不必担心什么是executor。只需将 StatefulPromise 类用作 JavaScript 中的原生 Promise 类,除了 then()catch() 或其他属性之外,还有一个名为 state 的属性。但是,如果您仍然好奇,可以在这里阅读更多内容:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…

标签: javascript node.js callback execfile


【解决方案1】:

您可以在 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)

【讨论】:

    【解决方案2】:

    经过更多搜索,我发现我的问题的解决方案已发布在另一个线程中。这很简单。我只需要使用 spawn() 而不是 execFile()。这将流式传输数据,而不是仅在回调完成后才解析。

    解决方法在这里: get execFile stdOut on chunks

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-04
      • 2020-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-25
      • 2023-03-31
      相关资源
      最近更新 更多