首页 > 解决方案 > 将基于 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);
    });
  });   
};

标签: javascriptnode.jsasynchronouspromisecallback

解决方案


首先,您需要为异步函数添加一个回调参数,删除 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);
};

而已。我希望这个解释能帮助你理解如何使用回调。


推荐阅读