2015-11-25 11 views
5

मैं संसाधन डाउनलोड करने और उसके हैश की गणना करने के लिए ब्राउज़र एक्सटेंशन में Fetch API का उपयोग करना चाहता हूं। निम्नलिखित काम करता है (Browserify के माध्यम से crypto का उपयोग कर)संसाधन संसाधन, गणना हैश, वापसी वादा

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

लेकिन नुकसान मैं संदर्भ में मैं एम्बेड करना चाहते हैं यह एक Promise वापस करने की आवश्यकता है, जबकि a.onloadend लिए इंतजार करना पड़ जाती हैं। इसके अलावा, यह पूरे ब्लॉब को पहले लाने के लिए काफी अजीब लगता है, फिर इसे FileReader में पढ़ने के लिए इसे createHash में डंप करने के लिए पढ़ें।

कोई संकेत?

+0

हो सकता है कि इस सवाल का बेहतर http के लिए फिट होगा: //codereview.stackexchange.com? – Pavlo

+0

यह प्रश्न ऐसा लगता है कि यह [कोड समीक्षा.एसई] (http://codereview.stackexchange.com/) के लिए एक बहुत अच्छा फिट हो सकता है, बशर्ते कि (ए) आप चाहते हैं कि आपके कोड की हर पहलू_ समीक्षा की गई हो, न केवल कुछ, (बी) आपका कोड _already working_ है, और (सी) आप _concrete, असली code_ की समीक्षा के लिए पूछ रहे हैं, अमूर्त डिज़ाइन नहीं (चाहे वह कोड के रूप में व्यक्त किया गया हो)। यदि आप उन सभी के साथ सहमत हैं, तो कृपया [विषय पर क्या है] (http://codereview.stackexchange.com/help/on-topic) के बारे में पढ़ें, और यदि आपका प्रश्न फिट बैठता है, तो इसे यहां हटाएं और इसे सीआर पर दोबारा पोस्ट करें । – Phrancis

+0

(ए) और (सी) यहां लागू नहीं हैं, इसलिए मुझे लगता है कि यह एक फिट नहीं है। –

उत्तर

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'); 
}) 
+0

आपके पहले कोड ब्लॉक में दूसरे '.then() 'हैंडलर में सिंक्रोनस कोड एक दूसरे' .then() 'हैंडलर में भी क्यों है? यह सिर्फ पहले '.then()' हैंडलर में नहीं है, जिसमें कोई दूसरा '.थ()' हैंडलर नहीं है? – jfriend00

+0

@ jfriend00: 'arrayBuffer()' एक वादा देता है – Bergi

+0

पहला ब्लॉक वास्तव में काम करता है। आपका बहुत बहुत धन्यवाद! –

2

मुझे लगता है कि आप यहां क्या मांग रहे हैं वह वादा करने का वादा करता है। आप then हैंडलर के अंदर एक वादा बना सकते हैं और इसे वापस कर सकते हैं।

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

+0

कृपया निम्नतम स्तर पर केवल प्रचार करें।वादे कॉलबैक में कॉल को 'क्रिप्टो' पर रखें। और एक त्रुटि हैंडलर संलग्न करने के लिए मत भूलना। – Bergi

संबंधित मुद्दे