javascript - 将基于 Promise 的方法转换为回调
问题描述
我是 js 新手。我已经阅读了许多关于异步性的先前堆栈溢出帖子,但仍然不明白下面的问题。
我有以下代码将图像文件上传到 S3 存储桶。代码需要实现的关键是让父级中的 image1 变量将信息存储在子函数中 s3.upload 调用的数据变量中。
我使用以下承诺的代码可以正常工作。我的理解是,同样的事情可以只使用回调来完成,我一直试图用回调重写下面的代码,只是作为一个学习练习,但它没有奏效。我将如何更改此代码以使用回调而不是承诺来做同样的事情?
父函数:
try {
image1 = await uploadToAWSBucket(file);
}
catch (error) {
return next(error);
}
孩子:
const uploadToAWSBucket = async (fileObject) => {
let randomFileName = shortid.generate();
const AWSUploadObject = {
Bucket: BUCKET_NAME,
Key: randomFileName,
Body: fileObject.buffer,
ContentType: fileObject.mimetype,
};
return new Promise((resolve, reject) => {
s3.upload(AWSUploadObject, (err, data) => {
if (err) {
return reject(err);
}
return resolve(data);
});
});
};
解决方案
首先,您需要为异步函数添加一个回调参数,删除 async 关键字
const uploadToAWSBucket = (fileObject, callback) => {
接下来,您需要以回调方式处理 s3 响应,将 Promise 替换为回调使用。
s3.upload(AWSUploadObject, (err, data) => {
if (err) {
callback(err);
return;
}
callback(null, data);
});
或者你甚至可以将其简化为
s3.upload(AWSUploadObject, callback)
您还需要将您的使用更新为回调方式
uploadToAWSBucket(file, (error, image1) => {
if (error) {
next(error);
return;
}
// your success code here
});
最终结果是
const uploadToAWSBucket = (fileObject, callback) => {
let randomFileName = shortid.generate();
const AWSUploadObject = {
Bucket: BUCKET_NAME,
Key: randomFileName,
Body: fileObject.buffer,
ContentType: fileObject.mimetype,
};
s3.upload(AWSUploadObject, callback);
};
而已。我希望这个解释能帮助你理解如何使用回调。
推荐阅读
- powerbi - 从我的 PowerBI 数据集中删除前 2.5%
- python - 从 Dask 数据帧中获取一行而不将整个数据帧加载到内存中
- python - 使用 Python 将 Outlook 中的电子邮件保存到文件夹中
- sql - 访问 - 将参数从一个查询传递到另一个查询
- eclipse - Maven:当子项目具有相同名称时,将多模块项目导入 Eclipse
- ruby - 解析文本文件以获取文本选择
- php - Mysql 和 PHP 中的巴士座位预订
- r - 将非特定长度字符串拆分为列
- php - Laravel/Eloquent 关系不一致
- python - 获取 Dialogflow 意图并查询 Firestore