我在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);
});
//})
}

此功能的业务是:
我使用这个函数:
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中的所有函数来获取下一步的最终数据。
答案 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();
})
);