2016-05-19 6 views
0

Dies ist eine Funktion zum Bearbeiten einiger Bilder über graphicsmagick in meiner Meteor-Anwendung.Meteor/JS: Wie man einen Callback vor einem anderen Callback durchführt

Wenn das Bild beschnitten wird, möchte ich prüfen, ob seine Breite> 900px ist. Dann sollte es auf 900px skaliert werden.

Diese komplette Funktion funktioniert nicht, da der Callback von gmread.size() beendet werden muss, bevor die return gmread.stream ausgeführt wird - was derzeit nicht der Fall ist. Aber ich weiß nicht, wie diese SYNCHRON/Asynchron Sache zum Laufen zu bringen ...

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

}); 

aktualisiert

Ich versuchte meteorhacks:async zu verwenden, aber ich erhalte die Fehler Exception in callback of async function: TypeError: Object [object Object] has no method 'size'.

function imageManipulation(inputId, method) { 
    var inStream = Files.findOneStream({ _id: inputId }), 
     gmread; 

    if (method == 'crop') { 
     gmread = gm(inStream); 

     // Asnyc doesn't work 
     gmread = Async.runSync(function(done) { 
      gmread.size(function(err, size) { 
       if (size.width > 900) { 
        gmread = gmread.resize('900'); 
       } 
       done(null, gmread); 
      }); 
     }); 
    } 

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

}); 

Antwort

0

können Sie meteorhacks:async verwenden, die die Ausführung pausieren, bis Sie() Rückruf getan invoke wie unten gezeigt.

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 
    }); 
+0

Vielleicht verstehe ich es nicht richtig, aber ich warte auf das Ergebnis von 'gored.size', um weiter zur Stream-Funktion zu gehen. Du hast es andersherum gemacht ...?! – user3142695

+0

Hat es funktioniert? –

+0

nein, es hat nicht funktioniert – user3142695