繁体   English   中英

如何在 Node.js 中的 function 外部访问 await function 变量

[英]How to access await function variable outside function in Node.js

我正在尝试实现await function 我试图在 function 之外访问的局部变量。 但是,我没有得到在 function 中定义的值。

async CreateProduceRateAsset(data, callback) {
    // Create a new file system based wallet for managing identities.
    try {
        var TimeStamp = new Date();
        var TxId = '';
        var blockNumber = '';
        const result = await contract.submitTransaction('CreateProduceRateAsset', args);

        await network.addBlockListener('block-listener', (err, block) => {
            if (err) {
                console.log(err);
                return;
            }

            TimeStamp = block.data.data[0].payload.header.channel_header.timestamp;
            var Tx_id = block.data.data[0].payload.header.channel_header.tx_id;
            var BlockNO = block.header.number;

            console.log('TxId', Tx_id)
            console.log('blockNumber', BlockNO)

            TxId = Tx_id
            blockNumber = BlockNO

            return TimeStamp, Tx_id, BlockNO
        });

        console.log('Timestamp', TimeStamp)
        console.log('TxId 123', TxId)
        console.log('blockNumber 123', blockNumber)

        response.data = result
        return callback(response);
    } catch (error) {
        response.httpstatus = 404;
        response.message = `Failed to get MVP Price ${error.message} `;
        return callback(response);
    }
};

在上面的代码中,我想访问Tx_idTimestampBlockNO 为此,我将一个局部变量分配给一个全局变量,但是,我仍然将它们的值设为空白。

有人可以帮助我获得这些价值观吗?

您必须将您的回报放入这样的变量中:

var data = await network.addBlockListener('block-listener', (err, block) => {
    if (err) {
        console.log(err);
        return;
    }

    TimeStamp = block.data.data[0].payload.header.channel_header.timestamp;
    var Tx_id = block.data.data[0].payload.header.channel_header.tx_id;
    var BlockNO = block.header.number;

    console.log('###########TxId#####################', Tx_id)
    console.log('###########blockNumber#####################', BlockNO)

    TxId = Tx_id
    blockNumber = BlockNO
    return {TimeStamp, Tx_id, BlockNO};
});
    
console.log('*************** Timestamp:: **********************', data.TimeStamp)
console.log('###########TxId#####################123', data.Tx_id)
console.log('###########blockNumber#####################123', data.BlockNO)

现在您可以将所有值存储到data中并将它们放入所需的变量中。

if I understand network.addBlockListener is a callback-based API and not return a promise so you cant await it, I guessed that you use https://hyperledger.github.io/fabric-sdk-node/release-1.4/module-结构网络.Network.html

这是您的代码和我的评论

async CreateProduceRateAsset(data, callback) {
  // Create a new file system based wallet for managing identities.
  try {
      var TimeStamp = new Date();
      var TxId = '';
      var blockNumber = '';
      const result = await contract.submitTransaction('CreateProduceRateAsset', args);
      // --> this api is callback based and wont not return a promise so you cant await it 
     await network.addBlockListener('block-listener', (err, block) => {
          if (err) {
              console.log(err);
              return;
          }
          TimeStamp = block.data.data[0].payload.header.channel_header.timestamp;
          // --> becasue you are inside a function these vars are not the same as the one ouside the call back , becasue they are scoped to this function 
          var Tx_id = block.data.data[0].payload.header.channel_header.tx_id;
          var BlockNO = block.header.number;
          console.log('###########TxId#####################', Tx_id)
          console.log('###########blockNumber#####################', BlockNO)
          TxId = Tx_id
          blockNumber = BlockNO
// --> you can only return one value in js, also this reurn is useless since you dont call this callback
// --> better way to get these vars outside the callback is to pass them to your own callbak like this `callback(response,TimeStamp, Tx_id, BlockNO)`
          return TimeStamp, Tx_id, BlockNO
      });
      console.log('*************** Timestamp:: **********************', TimeStamp)
      console.log('###########TxId#####################123', TxId)
      console.log('###########blockNumber#####################123', blockNumber)

      response.data = result
      return callback(response);
  } catch (error) {
      // if(error) throw error;
      // response.error = error;
      response.httpstatus = 404;
      response.message = `Failed to get MVP Price ${error.message} `;
      return callback(response);
  }

};

如果您需要将 async/await 与network.addBlockListener一起使用,您可以使用utils.promisify将其转换为基于 Promise 的 API 但我不推荐它,因为这是一个事件监听器

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM