2017-01-03 11 views
1

私はCryptoJsを使ってPDFファイルのハッシュ(sha256)を持っています。非同期関数からハッシュ値を取得する方法は?

私はすでにファイルのハッシュを持っていますが、私はその機能の外では取得できません。

これは私のコードです:

var reader = new FileReader(); 
var hash = ""; 

reader.onloadend = function(evt) { 
    if (evt.target.readyState == FileReader.DONE) { // DONE == 2 
     var i8a = new Uint8Array(evt.target.result); 
     var a = []; for (var i = 0; i < i8a.length; i += 4) { a.push(i8a[i] << 24 | i8a[i + 1] << 16 | i8a[i + 2] << 8 | i8a[i + 3]); } 
     var wordArray = CryptoJS.lib.WordArray.create(a,i8a.length); 
     var hash = CryptoJS.SHA256(wordArray); 
     alert(hash); 
    } 
}; 

var blob = file.slice(0, file.size + 1); 
reader.readAsArrayBuffer(blob); 

alert(hash); 

最初のアラートは私にSHAを与えるが、2番目は空です。 後で使用するために関数にハッシュを定義するにはどうすればよいですか?

コールバック関数を追加しても機能します。 は、しかし、私はAjaxリクエストを作りたかった、と私はこのようなコールバック関数へのリクエストを追加するとき:あなたがコールバックを必要とする

Uncaught TypeError: Cannot read property 'words' of undefined 

答えて

1

function callBack(hash){ 
    $.ajax({ 
      type: "POST", 
      url:"http://...", 
      dataType:'json', 
      data:({shaPdf: hash}), 
      success: function(data) { 
      //... 
      }, 
      error: function(error) { 
      } 
      }); 

私は私のコンソールにこのエラーが発生しています機能:

var reader = new FileReader(); 
var hash = ""; 

reader.onloadend = function(evt) { 
    if (evt.target.readyState == FileReader.DONE) { // DONE == 2 
     var i8a = new Uint8Array(evt.target.result); 
     var a = []; for (var i = 0; i < i8a.length; i += 4) { a.push(i8a[i] << 24 | i8a[i + 1] << 16 | i8a[i + 2] << 8 | i8a[i + 3]); } 
     var wordArray = CryptoJS.lib.WordArray.create(a,i8a.length); 
     var hash = CryptoJS.SHA256(wordArray); 
     callBack(hash); // <-- callBack at the end of this function 
    } 
}; 

var blob = file.slice(0, file.size + 1); 
reader.readAsArrayBuffer(blob); 

function callBack(hash) 
{ 
    alert(hash); 
} 

あなたreaderはすぐに他のコードの後のファイルの非同期、二alert火災をロードしているので、 。 readerはまだファイルをロードしていないので、ハッシュは空です。 をonloadendの後に呼び出す関数にラップすると、関数の外で値を使用することができます。

+0

これは動作していますが、私がajaxリクエストを行いたいと思った後、コールバック関数にajaxリクエストを追加すると、あなたのソリューションは動作しません。何か考えましたか? – wxcvbn

+0

基本的に同じです。非同期呼び出しで読み上げます。 Ajaxコールは、完了後にコールバックを必要とします。 – Mouser

+0

申し訳ありませんわからない、どうやってAJAXリクエストでコールバックできますか? – wxcvbn

関連する問題