node-sync不能使功能同步

时间:2016-04-12 11:17:55

标签: angularjs node.js

我在nodejs中有一个函数,有些原因我想在进行另一步之前进行同步。 目前我使用node-sync:

我的功能如下:



function downloadImageIcon(url,path,ori,callback){
    var request = require('request');
    //Sync(function() {
        request.get({url: url, encoding: 'binary'}, function (err, response, body) {
            console.log("start load: " + path);
            //Sync(function() {
                fs.writeFile( ori, body, 'binary', function (err) {
                    if (err)
                        console.log(err);
                    else {// if success then we need to convert it
                        console.log("converting : " + path);
                            fs.writeFileSync( path, imagemagick.convert({
                                srcData: fs.readFileSync(ori),
                                width: 1024,
                                height: 1024,
                                resizeStyle: 'aspectfill', // is the default, or 'aspectfit' or 'fill'
                                gravity: 'Center' // optional: position crop area when using 'aspectfill'
                            }));
                        callback();

                    }
                //});
            });
            console.log("end load: " + path);

    });
    //})
}




此功能的业务是:

  1. 从服务器下载图片
  2. 存储在本地
  3. 转换为不同的分辨率
  4. 我使用这个函数:

                paramMgr.getTemplateParam(comp.id, function (params) {
                    //Tao folder
                    var comp_folder_image = config.base_folder_url + comp.id + '/image';
                    mkdirp(comp_folder_image);
                    params.forEach(function(param){
                        if(param.varname == "icon"){
                            //return param.value;
                            Sync(function() {
                                downloadImageIcon.sync(null,config.imgUrl + param.value, comp_folder_image + '/icon.png', comp_folder_image + '/icon_ori.png', function () {
                                    console.log("done loading");
                                })
                            });
    
    
                        } else if(param.varname == "splashScreen"){
                            //return param.value;
                            Sync(function() {
                                downloadImageSplash.sync(null,config.imgUrl + param.value, comp_folder_image + '/splash.png', comp_folder_image + '/splash_ori.png')
                            });
    
                        }
                    });
    
                });
    

    因为我有许多paramMgr.getTemplateParam调用取决于comp.id,在getTemplateParam之后,我需要为这个comp做另一个业务,这一步需要从getTemplateParam生成数据。

    所以我需要同步getTemplateParam中的所有函数来获取下一步的最终数据。

2 个答案:

答案 0 :(得分:1)

您错误地使用了imagemagick.convert。它是异步功能。它也需要回调。更准确地阅读模块的文档。

答案 1 :(得分:0)

正如谢尔盖之前所说,imagemagick.convert是异步的。

fs.writeFileSync('mini.png', imagemagick.convert({
    srcData: fs.readFileSync('./orange.png'),
    width: 1024,
    height: 1024,
    resizeStyle: 'aspectfill', // is the default, or 'aspectfit' or 'fill'
    gravity: 'Center' // optional: position crop area when using 'aspectfill'
    }, function(err) {
      console.log("finished converting")
    })
);
console.log('callback');

输出

callback
finished converting

一个解决方案:

fs.writeFileSync(path, imagemagick.convert({
    srcData: fs.readFileSync(ori),
    width: 1024,
    height: 1024,
    resizeStyle: 'aspectfill', // is the default, or 'aspectfit' or 'fill'
    gravity: 'Center' // optional: position crop area when using 'aspectfill'
    }, function(err) {
      console.log("finished converting")
      callback();
    })
);