Just idea, maybe we can move that clean-up code to a small separate function as it's used twice (and followed by setTimeout every time). Also it would be great to put meaningful comment for that function to make things clear why we do this. Something like:

```
var cleanup.... = function() {
 // Using Promise is just to use setTimeout together with cleanup code
 return Promise(function(resolve) {
   canvas.width = canvas.height = 0;
   canvas = null;
   // Just curious, do we still need 0-length timeout if put cleanup inside promise ?
   setTimeout(resolve); 
 });
};

cleanup....then(callback.bind(null, resizedBlob))

and below...

cleanup....then(Utils._resizeImageBlobWithRatio.bind(Utils, {
  blob: blob,
  limit: limit,
  ratio: ratio * 2,
  callback: callback
}))

What do you think?