Firebase снимок реагирует обещание, как получить переменную снаружи? - PullRequest
0 голосов
/ 31 октября 2019

Я хочу получить переменную hours / minutes / secondes за пределами моего снимка с firebase, чтобы я мог вернуть сообщение об ошибке в моем обещании! Как я могу этого достичь? Моя переменная hours не определена, когда я выхожу за пределы функции firebase? «» «» «» «» «» «» «» «» «» «» «» «» «» «» «» «» «» «» «» «» «» «» «» «» «»

 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; });
    },


  }),
};

1 Ответ

0 голосов
/ 31 октября 2019

В вашем посте с вопросом не так много информации о контексте, в котором вы пытаетесь использовать переменные, определенные в await -ed "снимке" именованной переменной функции стрелка параметра, но это может не понадобиться, чтобы помочьВы, поэтому я постараюсь.

Кроме того, отказ от ответственности: я собираюсь ответить без особых знаний о реагировании, просто немного современного 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-контекста кода, который вы опубликовали.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...