2016-11-23 83 views
0

我有一系列url图像。我需要从远程URL下载异步这个图像到我的服务器。从远程URL下载什么图像

例:

// i need this function return array localfiles after download 

function someFunctionAsDownloadedRemoteIMages(arrayOfRemoteUrls){ 
    localImages = []; 
    arrayOfRemoteUrls.forEach(function(url){ 
     request.head(url, function(err, res, body){ 
      newImageName = randomInt(100000, 999999); 
      var filename = 'catalog/import/'+newImageName+'.jpg'; 

      request(url, {encoding: 'binary'}, function(error, response, body) { 
       fs.writeFile('image/'+filename, body, 'binary', function (err) { 
       if(err) 
        return; 
       localImages.push(filename); 
       }); 
      }); 
     }); 
    }); 
} 

var remoteImagesArray = ["http://example.com/1.jpg", "http://example.com/1444.jpg","http://example.com/ddsgggg.jpg"]; 

localImagesArray = someFunctionAsDownloadedRemoteIMages(remoteImagesArray); 

someFunctionProccess(localImagesArray); 
+0

那么是什么问题? –

回答

2

如果你想让它异步返回任何东西,你必须使用的,而不是从函数返回值的回调格局。有了这个说法,您还需要一种方法,一旦所有图像加载完毕,就会触发最终结果回调。我会建议使用像async一样的模块,并使用它提供的map函数。函数map将允许您处理数组,并返回一组结果。下面是一个例子:

var async = require('async'); 
var fs = require('fs'); 
var request = require('request'); 

function processUrl(url, callback){ 
    request.head(url, function(err, res, body){ 
      var newImageName = randomInt(100000, 999999); 
      var filename = 'catalog/import/'+newImageName+'.jpg'; 

      request(url, {encoding: 'binary'}, function(error, response, body) { 
       fs.writeFile('image/'+filename, body, 'binary', function (err) { 
       if(err) return callback(err); 
       callback(null,filename); 
       }); 
      }); 
     }); 
} 

function someFunctionAsDownloadedRemoteIMages(arrayOfRemoteUrls, callback){ 
    async.map(arrayOfRemoteUrls, processUrl, callback); 
} 



var remoteImagesArray = ["http://example.com/1.jpg", "http://example.com/1444.jpg","http://example.com/ddsgggg.jpg"]; 

someFunctionAsDownloadedRemoteIMages(remoteImagesArray, function(err, localImagesArray){ 
    if(err) //handle it 
    someFunctionProccess(localImagesArray); 
});