gpt4 book ai didi

javascript - 在 then 回调中使用 await - 保留关键字 'await'

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:11:09 28 4
gpt4 key购买 nike

在 node.js 中,我有一个数据库事务,我想在 then 回调中调用一个 async 方法,但我收到错误消息 关键字“等待”已保留

这是异步 saveImage 函数:

const saveImage = async (parsedLink) => {
AWS.config.region = config.awsSettings.region;
AWS.config.accessKeyId = config.awsSettings.accessKeyId;
AWS.config.secretAccessKey = config.awsSettings.secretAccessKey;
const bucket = new AWS.S3({
params: {
Bucket: config.awsSettings.images_bucket_name,
},
});

const currentDateString = new Date().toISOString().replace(/\:|\./g, '-');
const bodystream = new Buffer(parsedLink.imgUrl, 'binary');
const imageUrlDomain = parseDomain(parsedLink.linkUrl).domain;

const params = {
Key: `${parsedLink.id}/${imageUrlDomain}_${currentDateString}${parsedLink.imgType}`,
ContentType: parsedLink.imageMime,
ContentEncoding: 'base64',
Body: bodystream,
};

const resultPromise = await bucket.upload(params).promise();
return resultPromise.Location;
};

如果我想使用 saveImage 函数,我会收到错误消息。

module.exports.addTestObject = async (ctx) => {
const testObj = ctx.request.body;
try {
switch (testObj.type) {
case interestT.getType.link: {
const knexTestObject = TestObject.knex();
transaction(knexTestObject, trx =>
TestObject.query(trx)
.insert({
interestDate: testObj.date,
})
.then(newInterest => {
// save image
if (parsedLink.saveImg) {
parsedLink.imgUrl = await saveImage(testObj);
}

newInterest.$relatedQuery('linkInterestsRel', trx).insert({
linkHeader: testObj.linkHeader,
}),
}
),
)
.then((linkInterest) => {
console.log(linkInterest);
})
.catch((err) => {
throw err;
});
break;
}
default:
break;
}
ctx.response.body = interestObj;
} catch (err) {
const statusCode = err.status || 400;
ctx.throw(statusCode, err.message);
}
};

最佳答案

常规 function 同步运行直到它们返回。因此,您不能在其中使用 await,因为您不能以同步方式等待异步事件。

JavaScript 也有 async function,它们看起来像常规函数,但在概念上完全不同:它们同步运行直到到达 await,然后它们 停止并在等待的 Promise 解决后继续。因此,它们不能同步返回结果,而是返回一个 Promise,然后在函数完成执行时解析该 Promise。

因此您需要将函数转换为异步函数:

 async function getUsername() { // <-- async keyword here
return (await getUser()).name; // <-- await can be used inside
}

现在这也适用于 .then 回调:

 getUser().then(async function(user) {
const friends = await getFriends(user);
// ...
})

但这在某种程度上将抽象异步函数与其底层原始 Promise 混合在一起。如果你只是 await Promise 而不是添加 .then 回调,代码会变得更易读:

 (async function() {
const user = await getUser();
const friends = await getFriends(user);
})();

具体问题可以改写为:

 const linkInterest = await transaction(knexTestObject, async trx => {
const newInterest = await TestObject.query(trx)
.insert({ interestDate: testObj.date, });

if (parsedLink.saveImg) {
parsedLink.imgUrl = await saveImage(testObj);
}

await newInterest.$relatedQuery('linkInterestsRel', trx)
.insert({ linkHeader: testObj.linkHeader, }),
});

关于javascript - 在 then 回调中使用 await - 保留关键字 'await',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48172656/

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