Meteor / JS:如何在进行另一次回调之前进行回调

时间:2016-05-19 18:52:07

标签: javascript asynchronous meteor graphicsmagick

这是一个在我的流星应用程序中通过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'

1 个答案:

答案 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
    });