这是一个在我的流星应用程序中通过my $class = shift;
my ($self, %args);
if (ref $_[0] eq 'HASH') {
$self = shift @_;
%args = @_;
}
else {
%args = @_;
$self = delete $args{code};
}
处理一些图像的功能。
如果正在裁剪图像,我想检查其宽度是否> 900px。然后应将其调整为900px。
这个完整的函数不起作用,因为graphicsmagick
的回调必须在执行gmread.size()
之前完成 - 目前情况并非如此。但我不知道如何使这个同步/异步工作...
return gmread.stream
更新
我尝试使用function imageManipulation(inputId, method) {
var inStream = Files.findOneStream({ _id: inputId }),
gmread;
// do some image manipulation depending on given `method`
if (method == 'crop') {
gmread = gm(inStream);
// check if image width > 900px, then do resize
gmread.size(function(err, size) {
if (size.width > 900) {
gmread = gmread.resize('900');
}
});
}
return gmread.stream('jpg', Meteor.bindEnvironment(function(err, stdout, stderr) {
stderr.pipe(process.stderr);
if (!err) {
var outStream = Files.upsertStream({ _id: outputFileId }, {}, function(err, file) {
if (err) { console.warn("" + err); }
return;
});
return stdout.pipe(outStream);
}
}));
});
,但我收到错误meteorhacks:async
。
Exception in callback of async function: TypeError: Object [object Object] has no method 'size'
答案 0 :(得分:0)
你可以使用暂停执行的meteorhacks:async
,直到你调用done()回调,如下所示。
function imageManipulation(inputId, method) {
var inStream = Files.findOneStream({ _id: inputId }),
gmread;
// do some image manipulation depending on given `method`
if (method == 'crop') {
gmread = gm(inStream);
// check if image width > 900px, then do resize
gmread.size(function(err, size) {
if (size.width > 900) {
gmread = gmread.resize('900');
}
});
}
var response = Async.runSync(function(done) {
gmread.stream('jpg', Meteor.bindEnvironment(function(err, stdout, stderr) {
stderr.pipe(process.stderr);
if (!err) {
var outStream = Files.upsertStream({ _id: outputFileId }, {}, function(err, file) {
if (err) { console.warn("" + err); }
return;
});
done(null, stdout.pipe(outStream));
}
}));
});
return response.result
});