2017-06-21 17 views
3

私は問題がいつもわかっています。私はes6の約束を使用しています。私は複数のレイヤーを持っています。 実行時に私が約束を守らないと、コンソールにUncaught (in promise)があります。しかし、実際には私は自分のコードでそれを捕まえることがあります。未知(約束)

高速簡単な例:

LoginApi.js

var loginDaoCall = loginDao.login(username, password); 

loginDaoCall 
    .then(function (res) { 
     store.dispatch(loginSuccess()); 
     log.log("[loginApi.login] END"); 
    }) 
    .catch(function (err) { 
     store.dispatch(loginFail()); 
     errorUtils.dispatchErrorWithTimeout(errorLogin); 
     log.log(err); 
    }); 

return loginDaoCall; 

loginContainer.js

loginApi.login(user, password).then(() => { 
    // Change here instead of in render so the user can go back to login page 
    this.props.history.push(baseUrlRouter + "test"); 
}); // <- Error here cause I don't CATCH the promise, but I do catch it in my loginapi.js 

私は何もしないキャッチすることができることを知っているが、えっ。私はAPIレイヤーで履歴プッシュを行うこともできますが、それはその責任ではありません。

どうすれば私のコンソールでエラーを回避できますか?方法はありますか?私はそれをこのように残すことを考えています。

+0

ような何かをしたい場合がありますでしょうか? –

+0

これはエラーとして表示されますが、何も破らないので警告です。私はコンソールから警告/エラーが出るのは嫌です。それは悪い練習ではないので正当化されていません – Nevosis

+1

あなた自身のコード? * errorUtils.dispatchErrorWithTimeout(errorLogin); log.log(err); * –

答えて

1

あなたの問題は、あなたがloginDaoCall、ないエラーがすでに処理された約束を拒否するreturnであったということです。 loginApi.login(user, password)は実際に拒否された約束を返してくれましたが、それが別の支店で処理されていたとしても、さらに.then()によって返された約束は拒否され、処理されませんでした。それは、エラーや警告

あなたは

// LoginApi.js 
return loginDao.login(username, password).then(function (res) { 
    store.dispatch(loginSuccess()); 
    log.log("[loginApi.login] END"); 
    return true; 
}, function (err) { 
    store.dispatch(loginFail()); 
    errorUtils.dispatchErrorWithTimeout(errorLogin); 
    log.log(err); 
    return false; 
}); // never supposed to reject 

// loginContainer.js 
loginApi.login(user, password).then(success => { 
    if (success) { 
     // Change here instead of in render so the user can go back to login page 
     this.props.history.push(baseUrlRouter + "test"); 
    } 
}); 
+0

実際にloginDaoCallを返すだけで問題ありません。同じインスタンスのように見えますが、おそらくそうではないので、私は本当に違うものを手に入れません。 – Nevosis

0

キャッチブロックにエラーがあるようです。エラーがスローされると、第1キャッチブロックのエラーをキャッチする第2キャッチブロックはありません。それを修正する

...

.then(function (res) { 
    // some code that throws an error 
}) 
.catch(function (err) { 
    // some code that throws an error 
}) 
.catch(function (err) { 
    // This will fix your error since you are now handling the error thrown by your first catch block 
    console.log(err.message) 
}); 
関連する問題