Greifen Sie auf den Blob-Wert außerhalb der asynchronen Funktion canvas.ToBlob() zu

Lesezeit: 4 Minuten

Benutzer-Avatar
Sowmyan Soman

Ich arbeite mit HTMLCanvas -Element, das das Blob-Objekt außerhalb von zurückgibt async toBlob() Funktion. Diese Funktion gibt keinen Ausgabewert zurück, also versuche ich, eine Variable außerhalb zu deklarieren und über den Befehl darauf zuzugreifen.

Wie kann ich verwenden JS Promise für dieses Szenario?

var myblob;
            canvas.toBlob(function(blob) {                         
                              myblob = blob;
                              console.log("inside " + myblob); // getting value after the console outside
                           })
 console.log( "outside " + myblob); // getting undefined   

  • Führe die Aufgabe in dir aus .toBlob() Rückruf oder Nutzung Promise Konstrukteur

    – Gast271314

    25. Februar 2017 um 17:01 Uhr


  • Mögliches Duplikat von Warum bleibt meine Variable unverändert, nachdem ich sie innerhalb einer Funktion geändert habe? – Asynchrone Codereferenz

    –Andreas

    25. Februar 2017 um 17:05 Uhr

const blob = await new Promise(resolve => canvasElem.toBlob(resolve));

  • Brillant! Vielen Dank.

    – nodisch

    2. Oktober 2019 um 20:38 Uhr

  • Brilliant in der Tat 🙂

    – Rick

    30. August 2020 um 15:56 Uhr

  • Fantastisch! Kannst du oder jemand das erklären?

    – Daniel

    15. Dezember 2020 um 12:15 Uhr

Sie können verwenden Promise Konstrukteur, pass Blob Instanz zu resolve()Zugriff Promise Wert bei .then()

function getCanvasBlob(canvas) {
  return new Promise(function(resolve, reject) {
    canvas.toBlob(function(blob) {
      resolve(blob)
    })
  })
}

var canvasBlob = getCanvasBlob(canvas);

canvasBlob.then(function(blob) {
  // do stuff with blob
}, function(err) {
  console.log(err)
});

  • Vielen Dank und apreciate Ihre prompte Antwort. Mein Problem ist, dass ich den Wert von Blob in einer globalen Variablen festlegen muss, damit ich außerhalb dieser Funktion darauf zugreifen kann. zB: innerhalb des canvasBlob.then(function(blob)){ this.something = blob; }

    – Sowmyan Soman

    25. Februar 2017 um 19:04 Uhr


  • Sie können nicht zugreifen Blob bis .toBlob() Rückruf gibt einen Wert zurück. Verwende die erste übergebene Funktion .then() Aufgabe mit ausführen Blob aus .toBlob() Rückrufen.

    – Gast271314

    25. Februar 2017 um 19:07 Uhr


  • Vielen Dank. In meinem Szenario habe ich ein Videoelement und eine Arbeitsfläche, um einen Schnappschuss aus dem Video aufzunehmen und ihn in einem Bildsteuerelement zu rendern. Derzeit wird der Code im erfassenden Mausklick-Ereignis ausgeführt. Sobald ich das Bild habe, muss ich den Benutzer auf eine Schaltfläche klicken lassen, um dieses Bild per Ajax-Anfrage an den Server zu senden. Derzeit wird toBlob() im Capture-Ereignis ausgeführt. Ich würde gerne sehen, ob es eine Möglichkeit gibt, diesen Blob zu speichern, damit ich im Schaltflächen-Klick-Ereignis darauf zugreifen kann, um ihn an den Server zu senden. Jeder Rat wäre sehr hilfreich!

    – Sowmyan Soman

    25. Februar 2017 um 19:24 Uhr

  • Ich denke, durch den zweiten Aufruf von .toblob() beim Klicken auf die Schaltfläche wird das gleiche Bild zurückgegeben. Danke !

    – Sowmyan Soman

    25. Februar 2017 um 19:44 Uhr

  • Ihr erster Versuch ist nahe. Wann .toBlob() heißt, zuweisen myblob der Wert von Blob beim .toBlob() Rückrufen. Siehe auch stackoverflow.com/questions/42234835/…

    – Gast271314

    25. Februar 2017 um 19:44 Uhr


Benutzer-Avatar
Guillermo Pérez

ICH HABE EINE ANDERE IDEE … ähnlich der als beste Idee markierten … das Problem mit dann ist, dass Sie sich innerhalb des Blocks befinden müssen, um das Ergebnis des Versprechens abzurufen. Jetzt unterstützt Javascript erwarten Ähnlich wie bei c# ist dies gut, weil Sie die Funktion ausführen und warten können, bis sie aufgelöst ist, dann erhalten Sie das Ergebnis in einer Variablen, die keiner Funktion zugeordnet ist, Beispiel:

/* basically we create a function that receives a canvas called mycanvas, then we tell the function to return a new Promise, this promise is "resolved" inside the .toBlob method which by default provides a Blob parameter. */

function getCanvasBlob(mycanvas) {
  return new Promise(function(resolve, reject) {
    mycanvas.toBlob((blob) => {
      resolve(blob)
    })
  })
}

var myblob;

try{
  myblob = await getCanvasBlob(CANVAS_FROM_SOMEWHERE);
}
catch (error){
  console.log(error);
}

/* There's no need to use try/catch, you could use it just like this */

var myblob = await getCanvasBlob(CANVAS_FROM_SOMEWHERE);

Da die Methode asynchron ist, dann() nicht ausgeführt oder aufgerufen wird, bis das Promise aufgelöst ist, wird alles außerhalb dieser Methode nicht über Änderungen benachrichtigt, bis es zu spät ist … Der Vorteil hier ist, dass unser Javascript nicht fortgesetzt wird, bis das Promise vollständig aufgelöst wurde.

ZUSÄTZLICHE INFORMATIONEN: Wenn Sie await aufrufen, muss die Methode, von der aus Sie diese Funktion aufrufen, als asynchron markiert sein, andernfalls wird ein Fehler angezeigt … sagen wir zum Beispiel, dies wird innerhalb eines Klicks auf eine Schaltfläche aufgerufen:

/* OBVIOUSLY this will throw an error because I don't have a real canvas...*/

$( document ).ready(function() {
    
    $('#mybutton').bind('click', async function(){
    
      //...more code...
      //...more code... until...
      
      var CANVAS_FROM_SOMEWHERE;
      
      var myblob = await getCanvasBlob(CANVAS_FROM_SOMEWHERE);
    
    });
    
});

function getCanvasBlob(mycanvas) {
  return new Promise(function(resolve, reject) {
    mycanvas.toBlob((blob) => {
      resolve(blob)
    })
  })
}

   

    
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<button id="mybutton">process my canvas!</button>

1005850cookie-checkGreifen Sie auf den Blob-Wert außerhalb der asynchronen Funktion canvas.ToBlob() zu

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy