我目前正在尝试使用从Firebase中提取项目的值once,并使用该值填充var itemsList。但是,尽管在once呼叫中正确填充了itemList,但它在呼叫外的记录为undefined。我认为这可能与Firebase的异步特性有关,但是我不确定如何解决此问题。有什么建议?
once
itemsList
submitAnswer: function() { var userRef = usersRef.child(key); //get items_list for user var itemsList; userRef.once('value', (snap) => { itemsList = snap.val().items_list; console.log('items list populated here' + itemsList); }); console.log("items list not populated here" + itemsList); },
您对Firebase调用是正确的,它是异步的,并且在记录未填充的itemsList之前,代码不会等待它完成。
如果您只是想对数据做一些简单的事情,只需确保在执行任何操作之前先检查它是否存在(并像对待任何异步数据一样处理它)。
if(itemsList){ console.log('My items have arrived! ' + itemsList); }
如果该数据将进一步传播到您的应用程序,通常建议使用Firebase的响应数据调用setState(),以使用刚获取的新数据触发组件的重新渲染。
因此,遵循以下原则:
userRef.once("value", (snap) => { itemsList = snap.val().items_list; this.setState({ items: itemsList; }); }.bind(this));