5

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

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而我想嵌入它的上下文需要Promise返回。此外,首先获取整个 blob,然后将其读入 aFileReader以便之后将其转储,这似乎很奇怪createHash

有什么提示吗?

4

2 回答 2

2

我认为您在这里要求的是承诺链接。您可以在处理程序中创建一个 Promisethen并返回它。

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')

于 2015-11-25T23:09:46.290 回答
2

cryptohash.update方法也需要一个缓冲区,因此无需通过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');
})

如果这不起作用,您可以轻松地承诺a 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');
})
于 2015-11-26T05:39:05.800 回答