2017-06-08 45 views
1

處理`UnhandledPromiseRejectionWarning`我正在使用redux-observableisomorphic-fetch來處理我的React應用中的http請求。我贊成使用rxjs'ajax這個組合,因爲我使用Jest進行測試 - 它運行Node.js中的測試 - 並且想要用nock攔截http請求。看到這個相關的問題:Use fetch instead of ajax with redux-observable如何使用Observable.from(<Promise>)和捕獲錯誤Observable

所以這裏的問題是:我得到一個UnhandledPromiseRejectionWarning連同一個可怕:DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.,因爲我並沒有直接抓住我的承諾拒絕,而是留給了可觀察:

// apiModule.js 
import fetch from 'isomorphic-fetch' 

const api = { 
    getSomething:() => { 
    const request = fetch('http://some-api/') 
     .then(res => catchError(res)) // throwing an Error here if not response.ok 
     .then(res => res.json()) 

    return Observable.from(request) 
    } 
} 

然後在史詩:

// myReduxModule.js 
import {api} from './apiModule.js' 

const getSomethingEpic = action$ => 
    action$ 
    .ofType(GET_SOMETHING) 
    .mergeMap(action => 
     api 
     .getSomething() 
     .map(response => getSomethingSucceeded(response)) 
     .catch(error => logError(error)) // error is handled here! 
    ) 

所以承諾拒絕在Observable中處理,但不是直接處理!

任何建議如何避免在這種情況下的警告(和可能的將來終止與非零退出代碼)?

回答

2

從現在開始,每當您有承諾並致電then,您的必須也執行catch。也在你的測試中。

const request = fetch('http://some-api/') 
     .then(res => catchError(res)) 
     .then(res => res.json()) 
     .catch(err => catchError(res)) // <= here you should implement the catch