在javascript中实现回调

在javascript中实现回调,javascript,node.js,promise,chai-as-promised,Javascript,Node.js,Promise,Chai As Promised,我的助手js文件中有一个函数可以在S3上上传文件: module.exports.uploadToAWS = function uploadToAWS(folderName, fileName, fileData) { var s3 = new AWS.S3({ params: {Bucket: ‘myBucket’} }); var keyName = folderName + "/" + fileName; var buffer = new Buffer(fileData.

我的助手js文件中有一个函数可以在S3上上传文件:

module.exports.uploadToAWS = function uploadToAWS(folderName, fileName, fileData) {

  var s3 = new AWS.S3({ params: {Bucket: ‘myBucket’} });

  var keyName = folderName + "/" + fileName;

  var buffer = new Buffer(fileData.replace(/^data:image\/\w+;base64,/, ""),'base64')

  var data = {
    Key: keyName, 
    Body: buffer,
    ContentEncoding: 'base64',
    ContentType: 'image/jpeg'
  };

  s3.putObject(data, function(err, data) {
    if (err) { 
      console.log(err);
      console.log('Error uploading data: ', data); 
    } else {
      console.log('succesfully uploaded the image!');
    }
  });
}
我的消费者功能如下:

if(images) {
  images.forEach(function(imageRecord) {
    awsHelper.uploadToAWS('assets', assetObject.id, imageRecord);
  });            
}
我想在这里引入一个回调方法,这样我就可以从我的helper函数到我的调用者函数获得成功和失败。如何实施? 需要我的consumer函数如下,但是helper函数是什么样的呢

if(images) {
  images.forEach(function(imageRecord) {
    awsHelper.uploadToAWS(
      'assets',
      assetObject.id,
      imageRecord,
      function (success, failure) {
        //handle success or failure
      });
  });
}

为什么不简单地在“uploadToAWS”中添加一个回调,如:

然后做一个简单的验证,并在上传完成/失败时调用它(传递响应)

s3.putObject(data, function(err, data){
      if (err) { 
        console.log(err);
        console.log('Error uploading data: ', data); 
        if(typeof callback === 'function') callback(err , data);
      } else {
        console.log('succesfully uploaded the image!');
        if(typeof callback === 'function') callback(err , data);
      }
    });
在此之后,您将完全按照您的建议使用它

if(images){
            images.forEach(function(imageRecord){
                awsHelper.uploadToAWS('assets', assetObject.id, imageRecord, function (err , data) {
                    //handle success or failure    
                });
            });            
        }

为什么不简单地在“uploadToAWS”中添加一个回调,如:

然后做一个简单的验证,并在上传完成/失败时调用它(传递响应)

s3.putObject(data, function(err, data){
      if (err) { 
        console.log(err);
        console.log('Error uploading data: ', data); 
        if(typeof callback === 'function') callback(err , data);
      } else {
        console.log('succesfully uploaded the image!');
        if(typeof callback === 'function') callback(err , data);
      }
    });
在此之后,您将完全按照您的建议使用它

if(images){
            images.forEach(function(imageRecord){
                awsHelper.uploadToAWS('assets', assetObject.id, imageRecord, function (err , data) {
                    //handle success or failure    
                });
            });            
        }

您需要将回调函数作为helper函数的参数传递

试试这个:

module.exports.uploadToAWS = function uploadToAWS(folderName, fileName, fileData, callback){

    var s3 = new AWS.S3({ params: {Bucket: ‘myBucket’} });

    var keyName = folderName + "/" + fileName;

    var buffer = new Buffer(fileData.replace(/^data:image\/\w+;base64,/, ""),'base64')

    var data = {
        Key: keyName, 
        Body: buffer,
        ContentEncoding: 'base64',
        ContentType: 'image/jpeg'
    };

    s3.putObject(data, function(err, data){
       if (err) { 
         callback(err);
       } else {
         callback(null, data);
       }
    });
}

您需要将回调函数作为helper函数的参数传递

试试这个:

module.exports.uploadToAWS = function uploadToAWS(folderName, fileName, fileData, callback){

    var s3 = new AWS.S3({ params: {Bucket: ‘myBucket’} });

    var keyName = folderName + "/" + fileName;

    var buffer = new Buffer(fileData.replace(/^data:image\/\w+;base64,/, ""),'base64')

    var data = {
        Key: keyName, 
        Body: buffer,
        ContentEncoding: 'base64',
        ContentType: 'image/jpeg'
    };

    s3.putObject(data, function(err, data){
       if (err) { 
         callback(err);
       } else {
         callback(null, data);
       }
    });
}

因此,通过以承诺风格重写,您可以:

module.exports.uploadToAWSAsync = 
    function uploadToAWSAsync(folderName, fileName, fileData){
        return new Promise(function(resolve, reject){
            var s3 = new AWS.S3({ params: {Bucket: ‘myBucket’} });

            var keyName = folderName + "/" + fileName;

            var buffer = new Buffer(fileData.replace(/^data:image\/\w+;base64,/, ""),
                                    'base64')

            var data = {
                    Key: keyName, 
                    Body: buffer,
                    ContentEncoding: 'base64',
                    ContentType: 'image/jpeg'
                };

            s3.putObject(data, function(err, data){
                  if (err) { 
                    console.log(err);
                    console.log('Error uploading data: ', data); 
                    reject(err);
                  } else {
                    console.log('succesfully uploaded the image!');
                    resolve();
                  }
                });
        });
    }
您可以按如下方式重写您的消费者代码:

//fire them all off in one go
var promises = images.map(function(imageRecord){
    return awsHelper.uploadToAWSAsync('assets', assetObject.id, imageRecord);
}); 
Promise.all(promises).then(function(){
    //success, everything uploaded
}).catch(function(err){
    //something went wrong
});

因此,通过以承诺风格重写,您可以:

module.exports.uploadToAWSAsync = 
    function uploadToAWSAsync(folderName, fileName, fileData){
        return new Promise(function(resolve, reject){
            var s3 = new AWS.S3({ params: {Bucket: ‘myBucket’} });

            var keyName = folderName + "/" + fileName;

            var buffer = new Buffer(fileData.replace(/^data:image\/\w+;base64,/, ""),
                                    'base64')

            var data = {
                    Key: keyName, 
                    Body: buffer,
                    ContentEncoding: 'base64',
                    ContentType: 'image/jpeg'
                };

            s3.putObject(data, function(err, data){
                  if (err) { 
                    console.log(err);
                    console.log('Error uploading data: ', data); 
                    reject(err);
                  } else {
                    console.log('succesfully uploaded the image!');
                    resolve();
                  }
                });
        });
    }
您可以按如下方式重写您的消费者代码:

//fire them all off in one go
var promises = images.map(function(imageRecord){
    return awsHelper.uploadToAWSAsync('assets', assetObject.id, imageRecord);
}); 
Promise.all(promises).then(function(){
    //success, everything uploaded
}).catch(function(err){
    //something went wrong
});

我建议不要使用这种样式的消费者,而是建议返回一个承诺,这样您就可以
doSomthingAsync().then(function(){}).catch(function(){})
。如果你对此感兴趣,我可以写一个更复杂的答案。你提到的是
承诺
,但你说的是回电。您是希望以某种方式返回一个承诺,还是只返回一个解决方案就可以了?目前我只需要一个解决方案,javascript新手,刚刚听说过承诺,肯定会在未来使用它承诺是正确的选择,特别是现在它们已经成为即将发布的ecmascript中
async/await
特性的一部分。我建议不要使用这种风格的使用者,而是建议返回一个承诺,这样您就可以
doSomthingAsync().then(function(){}).catch(function(){})
。如果你对此感兴趣,我可以写一个更复杂的答案。你提到的是
承诺
,但你说的是回电。您是希望以某种方式返回一个承诺,还是只返回一个解决方案就可以了?目前我只需要一个解决方案,javascript新手,刚刚听说过承诺,肯定会在未来使用它承诺是正确的选择,特别是现在它们已经成为即将发布的ecmascript中
async/await
特性的一部分。不确定,但他们可能正在寻找基于承诺的解决方案,而不是纯粹的基于JS回调的解决方案。OP添加了一个
promise
标记。不确定,但他们可能正在寻找基于承诺的解决方案,而不是纯粹的基于JS回调的解决方案。