我正在使用以下代码,这些代码产生"可能的无人驾驶承诺拒绝":
constructor(props){
super(props)
DatabaseHandler.getInstance().getItems(function (items) {
console.log(items)//successfully print data
this.setState({inventoryArray: items}).bind(this)//causing error
})
}
不过,遵循代码成功运行,并在日志中打印响应:
constructor(props){
super(props)
DatabaseHandler.getInstance().getItems(function (items) {
console.log(items)//Successfully print data
})
}
如何解决此错误?
通常,在组件的constructor
中进行异步调用是一个坏主意。相反,我建议您从componentDidMount
拨打以下电话
class MyComponent extends React.Component {
componentDidMount() {
DatabaseHandler.getInstance().getItems(function (items) {
console.log(items)//Successfully print data
this.setState({ inventoryArray: items });
});
}
}
更多有关如何在官方react文档中使用
constructor
的信息
您还可以删除bind
并使用箭头功能,因此this
将上下文保留在组件中。
constructor(props) {
super(props)
DatabaseHandler.getInstance().getItems((items) => {
console.log(items)//successfully print data
this.setState({inventoryArray: items})
})
}
另外,您的.bind(this)
处于错误的位置。它应该放在外部}
(关闭function
)
constructor(props) {
super(props)
DatabaseHandler.getInstance().getItems(function (items) {
console.log(items)
this.setState({inventoryArray: items})
}.bind(this)) // bind should come here
}
在构造函数中提出API请求是一个不好的模式。ReactJS文档提到componentDidMount
是建议这样做的地方。
class YourComponent extends React.Component {
constructor(props) {
super(props)
this.state = {
inventoryArray: [],
}
}
componentDidMount() {
DatabaseHandler.getInstance().getItems((items) => {
console.log(items)//successfully print data
this.setState({inventoryArray: items})
})
}
}
进行以下更改解决了以下问题:
constructor(props) {
super(props)
this.onGetInventories = this.onGetInventories.bind(this)
//Loading inventory list from server
DatabaseHandler.getInstance().getItems(this.onGetInventories)
}
onGetInventories(items) {
console.log(items)
this.setState({inventoryArray: items})//Works
}