gpt4 book ai didi

javascript - 全局变量未在函数内更新

转载 作者:行者123 更新时间:2023-12-01 00:09:42 24 4
gpt4 key购买 nike

给出以下代码

var base64 = ''
const AWS = require('aws-sdk')
let awsConfig = {
'region': 'us-west-2',
'endpoint': 'http://dynamodb.us-west-2.amazonaws.com',
'accessKeyId': 'ABCDEFGHIJKLMANOPQRSTUVWXYZ',
'secretAccessKey': 'ABCDABSDJFGJALGJADSLGJALKDJGALKSDJGLA'
}

AWS.config.update(awsConfig)

let docClient = new AWS.DynamoDB.DocumentClient()

let fetchOneByKey = function () {
var params = {
TableName: 'test',
Key: {
'key1': 'abc'
}
}
docClient.get(params, function (err, data) {
if (err) {
console.log('test::fetchOneByKey::error - ' + err)
} else {
base64 = data.Item.b.toString('base64')
}
})
}

fetchOneByKey()
console.log(base64)

由于某种原因我的变量 base64不打印任何内容。这很奇怪,因为当我这样做时 console.log(data.Item.b.toString('base64')它打印 base64字符串,所以我知道数据肯定不为空。

由于某种原因,我的变量没有得到更新,我不确定为什么。我清楚地调用了函数 fetchOneByKey()所以理论上base64应该更新,但事实并非如此。

最佳答案

docClient.get() 是异步的。通过在调用函数后立即调用console.log(),您将在数据库读取完成之前执行它,因此您的变量不会更新。

在此处调用 console.log(base64)

else {
base64 = data.Item.b.toString('base64')
console.log(base64)
}

如果你想摆脱回调并使用 Promise 来代替,你可以使用 promisify 。这样,您就可以将其转换为 Promise 并将其与 async/await 一起使用,或者将其与 .then() 链接起来。

或者您可以手动兑现 promise 。

let fetchOneByKey = function () {
var params = {
TableName: 'test',
Key: {
'key1': 'abc'
}
}
return new Promise((resolve, reject) => {
docClient.get(params, function (err, data) {
if (err) {
console.log('test::fetchOneByKey::error - ' + err)
reject(err)
} else {
base64 = data.Item.b.toString('base64')
resolve(base64)
}
})
}
}

然后你可以说base64 = wait fetchOneByKey();或者,如果您不在 async 函数中,您可以执行 fetchOneByKey().then(base64 => console.log(base64))

编辑:正如@AZ_提到的,aws-sdk支持 promise

let fetchOneByKey = async function () {
var params = {
...
}
const data = await docClient.get(params).promise();
base64 = data.Item.b.toString('base64');
return base64
}

关于javascript - 全局变量未在函数内更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60155942/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com