Sfoglia il codice sorgente

emit errors to devtool instead

Evan You 8 anni fa
parent
commit
3d08a0196a
3 ha cambiato i file con 30 aggiunte e 17 eliminazioni
  1. 8 4
      src/index.js
  2. 7 5
      src/plugins/devtool.js
  3. 15 8
      test/unit/test.js

+ 8 - 4
src/index.js

@@ -132,10 +132,14 @@ class Store {
       if (!isPromise(res)) {
         res = Promise.resolve(res)
       }
-      return res.catch(err => {
-        console.error(`[vuex] error in Promise returned from action "${type}":`)
-        console.error(err)
-      })
+      if (store._devtoolHook) {
+        return res.catch(err => {
+          store._devtoolHook.emit('vuex:error', err)
+          throw err
+        })
+      } else {
+        return res
+      }
     })
   }
 

+ 7 - 5
src/plugins/devtool.js

@@ -1,17 +1,19 @@
-const hook =
+const devtoolHook =
   typeof window !== 'undefined' &&
   window.__VUE_DEVTOOLS_GLOBAL_HOOK__
 
 export default function devtoolPlugin (store) {
-  if (!hook) return
+  if (!devtoolHook) return
 
-  hook.emit('vuex:init', store)
+  store._devtoolHook = devtoolHook
 
-  hook.on('vuex:travel-to-state', targetState => {
+  devtoolHook.emit('vuex:init', store)
+
+  devtoolHook.on('vuex:travel-to-state', targetState => {
     store.replaceState(targetState)
   })
 
   store.subscribe((mutation, state) => {
-    hook.emit('vuex:mutation', mutation, state)
+    devtoolHook.emit('vuex:mutation', mutation, state)
   })
 }

+ 15 - 8
test/unit/test.js

@@ -108,22 +108,29 @@ describe('Vuex', () => {
     })
   })
 
-  it('capturing action Promise errors', done => {
-    const spy = sinon.spy(console, 'error')
+  it('detecting action Promise errors', done => {
     const store = new Vuex.Store({
       actions: {
         [TEST] () {
           return new Promise((resolve, reject) => {
-            reject(new Error())
+            reject('no')
           })
         }
       }
     })
-    store.dispatch(TEST).then(() => {
-      expect(spy).to.have.been.calledWith(`[vuex] error in Promise returned from action "${TEST}":`)
-      spy.restore()
-      done()
-    })
+    const spy = sinon.spy()
+    store._devtoolHook = {
+      emit: spy
+    }
+    const thenSpy = sinon.spy()
+    store.dispatch(TEST)
+      .then(thenSpy)
+      .catch(err => {
+        expect(thenSpy).not.to.have.been.called
+        expect(err).to.equal('no')
+        expect(spy).to.have.been.calledWith('vuex:error', 'no')
+        done()
+      })
   })
 
   it('getters', () => {