我使我的componentWillMount()
异步了。现在,我可以将await
与setState
一起使用了。
这是示例代码:
componentWillMount = async() => {
const { location, fetchRooms } = this.props
await this.setState({ roomId: room && room.roomId ? room.roomId : 0 })
fetchRooms()
}
所以这里的问题是this.setState
会返回诺言,因为我可以将await
与它一起使用吗?
编辑
当我等待时,它会按顺序1, 2, 3
运行;当我删除等待时,它会运行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()
}
答案 0 :(得分:7)
您可以承诺this.setState
,以便可以将React API用作承诺。这就是我的工作方式:
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))
答案 1 :(得分:5)
null
通常不与promises一起使用,因为很少有这种需求。如果在状态更新(setState
)之后调用的方法依赖于更新后的状态(fetchRooms
),则它可以通过其他方式访问它,例如作为参数。
roomId
使用回调,并且不返回承诺。由于很少需要这样做,因此创建未使用的承诺会导致开销。
为了兑现承诺,可以this answer中建议setState
。
发布的代码可与setState
配合使用,因为它是黑客。 await
是await ...
的语法糖。 Promise.resolve(...).then(...)
产生一滴答的延迟,该延迟允许在状态更新完成后评估下一行,从而可以按预期顺序评估代码。这与:
await
不能保证订单在不同条件下会保持不变。另外,第一个this.setState({ roomId: room && room.roomId ? room.roomId : 0 } => {
console.log(2)
})
setTimeout(() => {
console.log(3)
});
回调不是检查状态是否已更新的合适位置,这是第二个回调的目的。
答案 2 :(得分:2)
它不返回承诺。
您可以将await
关键字放在任何表达式前面。如果该表达式不符合承诺,则无效。
setState
接受回调。
答案 3 :(得分:1)
setState不返回承诺。
setState有一个回调。
this.setState({
...this.state,
key: value,
}, () => {
//finished
});
答案 4 :(得分:1)
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
答案 5 :(得分:0)
不要以为setState
返回Promise
,但是您可以随时这样做
await new Promise( ( resolve ) =>
this.setState( {
data:null,
}, resolve )
)
或者您可以制作一些实用功能
const setStateAsync = ( obj, state ) => {
return new Promise( ( resolve ) =>
obj.setState( state , resolve )
)
}
并在React.Component中使用它,如下所示:
await setStateAsync(this,{some:'any'})
答案 6 :(得分:0)
回答这个问题的更简单的方法是我们可以使用 node.js 的预安装 promisify
库中存在的 util
函数,然后将它与 await 关键字一起使用。
import {promisify} from 'util';
updateState = promisify(this.setState);
await this.updateState({ image: data });