使用Promises重写Javascript函数

时间:2016-06-29 15:54:40

标签: javascript es6-promise

我现在无法更新我的代码以使用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
        // ...
    }
}

我基本上为数组中的每个对象创建两个哈希,以简化以后的比较。一个具有一些被忽略的属性(重置为默认值),一个用于完整对象。

感谢您帮助我

2 个答案:

答案 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 */);
        }
    }
}