Fix a bug with Promise.catch() in PromiseMiddleware

The pending action will be modified and a newly created promise handler
will be returned.

This has (suddenly?) caused errors in tests because the catch() handlers defined in tests would be called before the one defined in PromiseMiddleware:

    const p = new Promise(...)

    const {payload} = store.dispatch({
      payload: new Promise(...),
      type: '...',
    })

    try {
      await payload
    } catch (err) {
      // this handler would be invoked before the catch handler in
      // PromiseMiddleware
    }

since the PromiseMiddleware adds a then-callback, followed by a
catch-callback.
This commit is contained in:
Jerko Steiner 2019-09-17 00:08:43 +07:00
parent 3398831571
commit c10d5cf115
2 changed files with 13 additions and 7 deletions

View File

@ -225,6 +225,7 @@ describe('createActions', () => {
error = err
}
expect(error!).toBeTruthy()
expect(store.getState().mapping.error).toMatch(/status code 500/)
expect(store.getState().handler.error).toMatch(/status code 500/)
})
})

View File

@ -24,21 +24,26 @@ export class PromiseMiddleware {
if (!isPromise(payload)) {
return next(action)
}
const pendingAction = {
...action,
status: 'pending',
}
// Propagate this action. Only attach listeners to the promise.
next(pendingAction)
payload
const promise = payload
.then(result => {
store.dispatch({
...action,
payload: result,
status: 'resolved',
})
return result
})
const pendingAction = {
...action,
payload: promise,
status: 'pending',
}
// Propagate this action. Only attach listeners to the promise.
next(pendingAction)
promise
.catch(err => {
store.dispatch({
...action,