我想在浏览器扩展中使用Fetch API来下载资源并计算其哈希值。以下作品(使用crypto到Browserify)
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
之后,这似乎很奇怪。
任何提示?
答案 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');
})