Kaynağa Gözat

#1 Change js interface for progress implementation

Ben Hsieh 9 yıl önce
ebeveyn
işleme
eb70391203
1 değiştirilmiş dosya ile 26 ekleme ve 1 silme
  1. 26
    1
      src/index.js

+ 26
- 1
src/index.js Dosyayı Görüntüle

4
  */
4
  */
5
 
5
 
6
 import { NativeModules } from 'react-native'
6
 import { NativeModules } from 'react-native'
7
+import { DeviceEventEmitter } from 'react-native';
7
 import base64 from 'base-64'
8
 import base64 from 'base-64'
8
 
9
 
9
 const RNFetchBlob = NativeModules.RNFetchBlob
10
 const RNFetchBlob = NativeModules.RNFetchBlob
20
 // Promise wrapper function
21
 // Promise wrapper function
21
 const fetch = (...args) => {
22
 const fetch = (...args) => {
22
 
23
 
24
+  // create task ID for receiving progress event
25
+  let taskId = getUUID()
23
   let promise = new Promise((resolve, reject) => {
26
   let promise = new Promise((resolve, reject) => {
24
 
27
 
25
     let [method, url, headers, body] = [...args]
28
     let [method, url, headers, body] = [...args]
26
     let nativeMethodName = Array.isArray(body) ? 'fetchBlobForm' : 'fetchBlob'
29
     let nativeMethodName = Array.isArray(body) ? 'fetchBlobForm' : 'fetchBlob'
27
 
30
 
28
-    RNFetchBlob[nativeMethodName](method, url, headers || {}, body, (err, ...data) => {
31
+    let progressEventHandler = (e) => {
32
+      if(e.taskId === taskId && promise.onProgress) {
33
+        promise.onProgress(e.written, e.total)
34
+      }
35
+    }
36
+
37
+    DeviceEventEmitter.addListener('RNFetchBlobProgress' + taskId, progressEventHandler)
38
+
39
+    RNFetchBlob[nativeMethodName](taskId, method, url, headers || {}, body, (err, ...data) => {
40
+
41
+      // task done, remove event listener
42
+      DeviceEventEmitter.removeAllListeners('RNFetchBlobProgress'+taskId)
43
+
29
       if(err)
44
       if(err)
30
         reject(new Error(err, ...data))
45
         reject(new Error(err, ...data))
31
       else
46
       else
32
         resolve(new FetchBlobResponse(...data))
47
         resolve(new FetchBlobResponse(...data))
48
+
33
     })
49
     })
34
 
50
 
35
   })
51
   })
36
 
52
 
53
+  promise.onProgress = null
54
+
37
   return promise
55
   return promise
38
 
56
 
39
 }
57
 }
81
 
99
 
82
 }
100
 }
83
 
101
 
102
+function getUUID(){
103
+  return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
104
+    let r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8);
105
+    return v.toString(16);
106
+  });
107
+}
108
+
84
 export default {
109
 export default {
85
   fetch, FetchBlobResponse, base64
110
   fetch, FetchBlobResponse, base64
86
 }
111
 }