componentWillMount()
を非同期にしました。これで、await
をsetState
とともに使用できます。
サンプルコードは次のとおりです。
componentWillMount = async() => {
const { location, fetchRooms } = this.props
await this.setState({ roomId: room && room.roomId ? room.roomId : 0 })
fetchRooms()
}
だからここでの質問は、this.setState
はpromiseを返すということです。await
を使用できるからです。
Edit
Awaitを置くと、それはシーケンス1, 2, 3
で実行され、awaitを削除すると、1, 3, 2
??を実行します。
componentWillMount = async() => {
const { location, fetchRooms } = this.props
console.log(1)
await this.setState({ roomId: room && room.roomId ? room.roomId : 0 } => {
console.log(2)
})
console.log(3)
fetchRooms()
}
setState
は、そのような必要性はめったにないため、通常はpromiseで使用されません。状態更新後に呼び出されるメソッド(fetchRooms
)が更新された状態(roomId
)に依存している場合、別の方法でアクセスできます。パラメータとして。
setState
はコールバックを使用し、promiseを返しません。これはめったに必要とされないため、使用されないプロミスを作成するとオーバーヘッドが発生します。
約束を返すために、 この答え で提案されているように、setState
を約束することができます。
投稿されたコードは、ハックだからawait
で動作します。 await ...
はPromise.resolve(...).then(...)
の構文糖衣です。 await
は、状態の更新が完了した後、次の行を評価できる1ティックの遅延を生成します。これにより、意図した順序でコードを評価できます。これは次と同じです:
this.setState({ roomId: room && room.roomId ? room.roomId : 0 } => {
console.log(2)
})
setTimeout(() => {
console.log(3)
});
注文が異なる条件下で同じままであるという保証はありません。また、最初のsetState
コールバックは、状態が更新されたかどうかをチェックする適切な場所ではありません。これが2番目のコールバックの目的です。
React APIを約束として使用できるように、this.setState
を約束することができます。これは私がそれを動作させる方法です:
class LyricsGrid extends Component {
constructor(props) {
super(props);
this.setAsyncState = this.setAsyncState.bind(this);
}
setAsyncState = (newState) =>
new Promise((resolve) => this.setState(newState, () => resolve()));
後で、標準のPromise APIを使用してthis.setAsyncState
を呼び出します。
this.setAsyncState({ lyricsCorpus, matrix, count })
.then(foo1)
.then(foo2)
.catch(err => console.error(err))
setStateはpromiseを返しません。
setStateにはコールバックがあります。
this.setState({
...this.state,
key: value,
}, () => {
//finished
});
約束を返しません。
式の前にawait
キーワードを叩くことができます。その式がプロミスに評価されない場合、効果はありません。
setState
はコールバックを受け入れます。
componentWillMount = async () => {
console.log(1);
await this.setRooms();
console.log(3);
};
setRooms = () => {
const { fetchRooms } = this.props;
return fetchRooms().then(({ room }) => {
this.setState({ roomId: room && room.roomId ? room.roomId : 0 }, _ =>
console.log(2)
);
});
};
または
setRooms = async () => {
const { fetchRooms } = this.props;
const { room } = await fetchRooms();
return new Promise(resolve => {
this.setState({ roomId: room && room.roomId ? room.roomId : 0 }, _ =>
resolve()
);
});
};
このヘルプ= Dを願っています