2016-06-23 52 views
0

我在幫助我的js文件的功能來上傳上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

所以,你可以:

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增加了一個'promise'標籤。不確定,但他們可能正在尋找基於承諾的解決方案,而不是純粹的基於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); 
     } 
    }); 
}