2016-06-23 3 views
0

У меня есть функция в моем помощнике расслоения плотного файл для загрузки файлов на S3:Реализация обратных вызовов в JavaScript

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); 
    });    
} 

Я хочу, чтобы ввести метод обратного вызова здесь, чтобы я мог добиться успеха и отказа от моей вспомогательной функции для моей функции звонящего. Как это можно реализовать? Нужно, чтобы моя потребительская функция была следующей, но какова будет вспомогательная функция?

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

Я бы рекомендовал против потребителя в этом стиле и вместо этого рекомендует возвращать Promise, поэтому вы можете 'doSomthingAsync(). then (function() {}). catch (function () {}) 'вместо этого. Если это вас интересует, я могу написать более ответный ответ. – spender

+0

Вы упоминаете «обещание», но вы говорите о обратных вызовах. Вы предпочитали как-то вернуть обещание, или было бы решение только для обратного вызова? –

+0

В настоящее время мне просто нужно решение, новое для javascript, только что услышанное обещание, определенно будет использовать его в будущем – Firdous

ответ

1

Итак, переписав в стиле Promise, вы можете:

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 
}); 
2

Почему вы не просто добавить обратного вызова в «uploadToAWS», как:

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

Затем сделайте простую проверку и назовите его (Передача ответа), когда ваша загрузка завершена/сбой

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  
       }); 
      });    
     } 
+0

В OP добавлен тег 'prom'. Не уверен, но они могут искать решение на основе обещаний, а не чистое решение на основе обратного вызова JS. –

1

Вам необходимо передать функцию обратного вызова в качестве аргумента для вспомогательной функции.

Попробуйте это:

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); 
     } 
    }); 
} 
Смежные вопросы