我现在无法更新我的代码以使用promises。
哈希函数正在运行,但已更改。它现在返回一个承诺而不是一个值。我不知道如何使用它: - (
function hash(input) {
// transform the input into an arraybuffer.
let buffer = new TextEncoder("utf-8").encode( JSON.stringify(input) );
return window.crypto.subtle.digest("SHA-256", buffer).then( (hash)=> {
return btoa(String.fromCharCode( ...new Uint8Array(hash) ));
});
}
这是需要重写的功能。 hash(...)被多次调用。
function update(){
// array of Objects (empty to simplify my question)
let data = [{}, {}, {}];
// if data has changed => process it
if( hash(data) !== hash(previousData) ){
// clone for next time comparison (before calculating hashes!)
previousData = JSON.parse(JSON.stringify(data)); // simple deepclone
data.forEach( item=>{
// reset dynamic values within a cloned item for simple item comparison checks
item.id = hash( Object.assign( {}, item, {dynValue:1}) );
//complet item hash including dynamic values
item.hash = hash( item );
});
// fire event with changed data array
// ...
}
}
我基本上为数组中的每个对象创建两个哈希,以简化以后的比较。一个具有一些被忽略的属性(重置为默认值),一个用于完整对象。
感谢您帮助我
答案 0 :(得分:1)
您在比较中必须更改,因为您现在正在编写异步代码。比较必须等到两个调用hash
都解决。
示例代码:
var hash = hash(data);
var hashPrev = hash(previousData);
hash.then((hashVal) => {
hashPrev.then((hashPrevVal) => {
if (hashVal == hashPrevVal) doFurtherLogicHere();
});
});
答案 1 :(得分:1)
理想情况下,您希望尝试保留散列函数调用的直接性质,因为更改它将需要如此大的重写,但是如果没有这个,您可能会做一些像Promise ......然后链。
function update() {
//Same code
Promise.all([hash(data), hash(previousData)]), then(values => {
if (values[0] !== values[1]) {
//Same code
var promiseChain = [];
data.forEach(item=> {
promiseChain.push(
Promise.all([
hash(Object.assign({}, item, {dynValue:1})),
hash(item)
]).then(values=> {
item.id = values[0];
item.hash = values[1];
})
);
});
Promise.all(promiseChain).then(/* fire event with changed data array */);
}
}
}