获取资源,计算哈希,返回承诺

时间:2015-11-25 21:05:08

标签: javascript hash promise fetch-api

我想在浏览器扩展中使用Fetch API来下载资源并计算其哈希值。以下作品(使用cryptoBrowserify

systemconfig.repository_path AS EQ_IMAGE_REPOSITORY_PATH,

但缺点是我必须等待fetch(url).then(function(response) { return response.blob(); }).then(function(data) { var a = new FileReader(); a.readAsBinaryString(data); a.onloadend = function() { var hash = crypto.createHash(hashType); hash.update(a.result, 'binary'); return hash.digest('hex'); }; }) ,而我想要嵌入它的上下文需要返回a.onloadend。此外,首先获取整个blob,然后将其读入Promise只是为了将其转储到FileReader之后,这似乎很奇怪。

任何提示?

2 个答案:

答案 0 :(得分:2)

我认为你在这里要求的是承诺链。您可以在then处理程序中创建一个promise并将其返回。

var yaypromise = fetch(url).then(function(response) {
  return response.blob();
}).then(function(data) {
  return new Promise(function(resolve, reject){
      var a = new FileReader();
      a.readAsBinaryString(data);
      a.onloadend = function() {
        var hash = crypto.createHash(hashType);
        hash.update(a.result, 'binary');
        resolve(hash.digest('hex'));
      };  
  });
})

然后yaypromise可能是您正在寻找的承诺。它将通过hash.digest('hex')

解决

答案 1 :(得分:2)

crypto hash.update method也需要缓冲区,因此无需通过FileReader绕道而行。只是做

fetch(url).then(function(response) {
    return response.arrayBuffer();
}).then(function(arrayBuffer) {
    var buffer = require('buffer')(new Uint8Array(arrayBuffer));
    var hash = require('crypto').createHash(hashType);
    hash.update(buffer, 'binary');
    return hash.digest('hex');
})

如果这不起作用,您可以easily promisify FileReader

function getResult(reader) {
    return new Promise(function(resolve, reject) {
        reader.onload = function() {
            resolve(this.result);
        };
        reader.onerror = reader.onabort = reject;
    });
}

并像这样使用它:

fetch(url).then(function(response) {
    return response.blob();
}).then(function(data) {
    var a = new FileReader();
    a.readAsBinaryString(data);
    return getResult(a);
}).then(function(result) {
    var hash = crypto.createHash(hashType);
    hash.update(result, 'binary');
    return hash.digest('hex');
})