试图让firebase的价值观偏离承诺
我是一个新的本地人,我很难从承诺中的firebase查询中获取值 我试图在promise中设置state,但控制台返回:TypeError:_this2.setState不是函数试图让firebase的价值观偏离承诺,firebase,react-native,geofire,Firebase,React Native,Geofire,我是一个新的本地人,我很难从承诺中的firebase查询中获取值 我试图在promise中设置state,但控制台返回:TypeError:_this2.setState不是函数 _getActivites() { const latitude = 42.297761; const longitude = 4.636235; const radius = 5; var keys = []; var activitesToState = [];
_getActivites() {
const latitude = 42.297761;
const longitude = 4.636235;
const radius = 5;
var keys = [];
var activitesToState = [];
const firebaseRef = firebase.database().ref("activites_locations/");
const geoFire = new GeoFire(firebaseRef);
var geoQuery;
var activites = [];
geoQuery = geoFire.query({
center: [latitude, longitude],
radius: radius
});
geoQuery.on("key_entered", function(key, location, distance) {
keys.push(key);
});
geoQuery.on("ready", function() {
var promises = keys.map(function(key) {
return firebaseRef.child(key).once("value");
});
Promise.all(promises).then((snapshots) => {
snapshots.forEach(function(snapshot) {
activites.push(snapshot.val());
});
this.setState({
activitesState: activites,
})
}).catch((error) => {
console.log(error);
});
});
};
componentDidMount() {
firebase.auth().signInAnonymously()
.then(() => {
this.setState({
isAuthenticated: true,
});
});
this._getActivites();
}
您正在函数调用中丢失
this
的值。您应该通过将函数更新为箭头函数来绑定调用。您还可以通过将其设置为函数范围内的一个变量来停止此的丢失
_getActivites() {
const latitude = 42.297761;
const longitude = 4.636235;
const radius = 5;
var keys = [];
var activitesToState = [];
const firebaseRef = firebase.database().ref("activites_locations/");
const geoFire = new GeoFire(firebaseRef);
var geoQuery;
var activites = [];
geoQuery = geoFire.query({
center: [latitude, longitude],
radius: radius
});
geoQuery.on("key_entered", function(key, location, distance) {
keys.push(key);
});
geoQuery.on("ready", function() {
var promises = keys.map(function(key) {
return firebaseRef.child(key).once("value");
});
Promise.all(promises).then((snapshots) => {
snapshots.forEach(function(snapshot) {
activites.push(snapshot.val());
});
this.setState({
activitesState: activites,
})
}).catch((error) => {
console.log(error);
});
});
};
componentDidMount() {
firebase.auth().signInAnonymously()
.then(() => {
this.setState({
isAuthenticated: true,
});
});
this._getActivites();
}
重构代码时,您可能会遇到如下情况:
_getActivites = () => { // change to arrow function
const that = this; // capture the value of this
const latitude = 42.297761;
const longitude = 4.636235;
const radius = 5;
var keys = [];
var activitesToState = [];
const firebaseRef = firebase.database().ref('activites_locations/');
const geoFire = new GeoFire(firebaseRef);
var geoQuery;
var activites = [];
geoQuery = geoFire.query({
center: [latitude, longitude],
radius: radius
});
geoQuery.on('key_entered', (key, location, distance) => { // change to arrow function
keys.push(key);
});
geoQuery.on('ready', () => { // change to arrow function
var promises = keys.map((key) => { // change to arrow function
return firebaseRef.child(key).once('value');
});
Promise.all(promises).then((snapshots) => {
snapshots.forEach((snapshot) => {
activites.push(snapshot.val());
});
that.setState({ activitesState: activites }); // use "that" instead of "this"
}).catch((error) => {
console.log(error);
});
});
}
这里有一个关于
this
和它失去上下文的好例子。您正在函数调用中失去this
的价值。您应该通过将函数更新为箭头函数来绑定调用。您还可以通过将其设置为函数范围内的一个变量来停止此的丢失
_getActivites() {
const latitude = 42.297761;
const longitude = 4.636235;
const radius = 5;
var keys = [];
var activitesToState = [];
const firebaseRef = firebase.database().ref("activites_locations/");
const geoFire = new GeoFire(firebaseRef);
var geoQuery;
var activites = [];
geoQuery = geoFire.query({
center: [latitude, longitude],
radius: radius
});
geoQuery.on("key_entered", function(key, location, distance) {
keys.push(key);
});
geoQuery.on("ready", function() {
var promises = keys.map(function(key) {
return firebaseRef.child(key).once("value");
});
Promise.all(promises).then((snapshots) => {
snapshots.forEach(function(snapshot) {
activites.push(snapshot.val());
});
this.setState({
activitesState: activites,
})
}).catch((error) => {
console.log(error);
});
});
};
componentDidMount() {
firebase.auth().signInAnonymously()
.then(() => {
this.setState({
isAuthenticated: true,
});
});
this._getActivites();
}
重构代码时,您可能会遇到如下情况:
_getActivites = () => { // change to arrow function
const that = this; // capture the value of this
const latitude = 42.297761;
const longitude = 4.636235;
const radius = 5;
var keys = [];
var activitesToState = [];
const firebaseRef = firebase.database().ref('activites_locations/');
const geoFire = new GeoFire(firebaseRef);
var geoQuery;
var activites = [];
geoQuery = geoFire.query({
center: [latitude, longitude],
radius: radius
});
geoQuery.on('key_entered', (key, location, distance) => { // change to arrow function
keys.push(key);
});
geoQuery.on('ready', () => { // change to arrow function
var promises = keys.map((key) => { // change to arrow function
return firebaseRef.child(key).once('value');
});
Promise.all(promises).then((snapshots) => {
snapshots.forEach((snapshot) => {
activites.push(snapshot.val());
});
that.setState({ activitesState: activites }); // use "that" instead of "this"
}).catch((error) => {
console.log(error);
});
});
}
这里有一个关于
这篇
的好文章,它失去了它的上下文。非常感谢你的代码和文章,它真的帮助了我很多!知道我是一个初学者,您认为我编写的代码是使用firebase和geofire查询数据的最佳方式(性能方面)吗?你认为我能做些改进吗?看起来不错。我喜欢你用承诺。所有,这样你只设定一次状态。谢谢!再次感谢你用React Native帮助我提高自己。非常感谢你的代码和文章,它真的帮了我很大的忙!知道我是一个初学者,您认为我编写的代码是使用firebase和geofire查询数据的最佳方式(性能方面)吗?你认为我能做些改进吗?看起来不错。我喜欢你用承诺。所有,这样你只设定一次状态。谢谢!再次感谢你帮助我用React Native提升自己。