无法从函数中设置变量

问题描述

我来自Python的背景,几乎没有JavaScript经验,所以我在这里有点不了解。

我正在尝试做看似简单的事情,获取一个AWS账户ID并将其存储在变量中。我正在引用this StackOverflow question中的代码,但已对其进行了一些修改。

<script src="https://cdn.jsdelivr.net/npm/ipfs/dist/index.min.js"></script>

<script>
    (async () => {
        window.node = await Ipfs.create()
        window.node.libp2p.on('peer:discovery',(peer) => console.log('peer:discovery',peer))
        window.node.libp2p.on('peer:connect',peerInfo => console.log('peer:connect',peerInfo))
        window.node.libp2p.on('peer:disconnect',peerInfo => console.log('peer:disconnect',peerInfo))
        window.node.libp2p.peerStore.on('peer',(peerId) => console.log('peer',peerId))
        window.node.libp2p.peerStore.on('change:multiaddrs',({ peerId,multiaddrs}) => {
            const addresses = []
            for (const multiaddr of multiaddrs) {
                addresses.push(multiaddr.buffer.toString())
            }
            console.log('change:multiaddrs',{peerId,multiaddrs,addresses})
        })
        window.node.libp2p.peerStore.on('change:protocols',protocols}) => console.log('change:protocols',protocols}))
        window.node.libp2p.on('error',(err) => console.log('error',err))
        window.node.libp2p.connectionManager.on('peer:connect',(connection) => {
            console.log('connectionManager:peer:connect',{connection,remoteAddr: connection.remoteAddr.buffer.toString()})
        })
        window.node.libp2p.connectionManager.on('peer:disconnect',(connection) => console.log('connectionManager:peer:disconnect',connection))

        // fake CID does not exist
        results = window.node.get("QmZbj5ruYneZb8FuR9wnLuJCpCXMQudhSdWhdhp5U1oPWJ")
        for await (res of results) {
          for await (content of res.content) {
             window.content = content
              console.log(content.toString())
            }
        }
    })()
</script>

如果我将console.log语句保留为注释状态,则会看到正在打印到控制台的AWS账户ID,这是我所期望的。但是,如果我取消注释该行,则会得到一个很大的对象(我假设它实际上是 data 变量),该对象将被打印到控制台。

我只希望 account 变量等于帐户ID。我在这里做什么错了?

解决方法

该函数是异步的,因此您无法真正分配该值。该值会在将来某个时候在回调中解析。至此console.log已经执行。

您可以做两件事,在回调中添加需要account的逻辑或使用诺言。

sts.getCallerIdentity({}).promise().then((data) => console.log(data));
sts.getCallerIdentity({},(err,data) => {...stuff});

请记住,这些值将在将来的某个时间解决。

,

在运行回调之前,account变量不会设置所需的数据。也许尝试这样的事情?

var account = sts.getCallerIdentity({},function (err,data) {
    if (err) {
        console.log("Error ",err)
    } else {
        account = data.Account.toString();
        doOtherStuff();
    }
});

function doOtherStuff() {
  console.log(account);
}

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...