Firebase快照反应承诺如何获取外部变量



我想在firebase快照之外获取变量hours / minutes / secondes,这样我就可以在promise中返回错误消息!我怎样才能做到这一点?当我离开firebase函数时,我的变量hours没有定义

addQuestion(formData) {
//  console.log('addquestion')
const {
theQuestion,
} = formData;
return new Promise(async (resolve, reject) => {
// Are they a user?
const UID = await Firebase.auth().currentUser.uid;
if (!UID) return reject({ message: errorMessages.memberNotAuthd });

await FirebaseRef.child('questions').orderByChild('author').equalTo(UID).limitToLast(1)
.once("value").then(snapshot => {
snapshot.forEach(function (childSnapshot) {
var value = childSnapshot.val();
const LastQuestionTime =  value.timestamp

var dateFuture = new Date(LastQuestionTime);
var dateNow = new Date();
var seconds = Math.floor((dateNow - (dateFuture))/1000);
var minutes = Math.floor(seconds/60);
var hours = Math.floor(minutes/60);
var days = Math.floor(hours/24);
hours = hours-(days*24);
minutes = minutes-(days*24*60)-(hours*60);
seconds = seconds-(days*24*60*60)-(hours*60*60)-(minutes*60);
})
if (hours <= 0) return reject({ message: 'error '+60-minutes+' minutes'});
});

// Validation rules
if (!theQuestion) return reject({ message: 'Veuillez écrire une question' });

var userInfo = {
question : theQuestion,
author : UID,
timestamp: Firebase.database.ServerValue.TIMESTAMP,
}; //use
// Go to Firebase
return Firebase.database().ref('questions').push(userInfo)
.then(async () => {

//  this.replaceRecipes(data);
return resolve();
}).catch(reject);
}).catch((err) => { throw err.message; });
},

}),
};

您的问题帖子中没有太多关于您尝试使用await-ed"snapshot"命名参数变量箭头函数中定义的变量的上下文的信息,但这可能对您没有帮助,所以我会尝试。

此外,免责声明:我将在没有太多reactjs知识的情况下回答,只是一些当代JavaScript。此外,我并没有测试下面的代码片段,它们只是建议,而不是真正的代码。此外,我不太分析你的代码的异步调用结构,所以我可能会偏离,但我认为你可以

将您需要的变量附加到适当范围的对象变量上,如:

var externalvariable = { prop_one: 'with data' };
function returnsPromise(paramOne) {
return new Promise(async (resolve, reject) => {
await awaitFuncCall(paramData).then(snapshotdata => {
var dateNow = new Date();
//attach data to external scoped object variable
externalvariable.date = dateNow;
//then continue on with async
//maybe resolve(externalvariable);
resolve();
});
}
}
//use data then here like
usefulFuncWorkCall(externalvariable, externalvariable.date);
//or ((pseudocode(!!)))
let duration = (new Date()) - externalvariable.date;

或者,(根据我对代码的了解,可能性较小(您可以将要使用的数据附加到要返回的变量;可能是你发布的代码中的"userInfo"变量,比如userInfo.questionDateData = datedatavariable

最后重申否认责任:可能有一种更好的实际或更"ReactJS"或代码库约定的方式来做你想做的事情,我的建议只涉及你发布的代码的JavaScript上下文。

希望能有所帮助!

最新更新