возврат значения asyn c возвращает «неопределенное» - почему я не могу вернуть значение? - PullRequest
0 голосов
/ 21 января 2020

Я возвращаю значение из одного класса / функции в другой.

класс 1:

const updateLikedQueue  = (dispatch) => {
return  async (likedId)=>{
    try{
        const response = await config.updateUserData(likedId, 'liked');
        const matchResponse = await config.lookForMatches(likedId);
        console.log('matchResponse> ' + matchResponse);//undefined
        dispatch({type: 'update_user_liked_data', payload: response});
        if(matchResponse){
            dispatch({type: 'update_user_matches_data', payload: likedId});
            return 'You have a match!'
        }
    } catch(e){
        dispatch({type: 'add_error', payload: '' + e}); 
    }
}
};

класс 2:

lookForMatches = async (likedId) => {
var db = firebase.firestore();
var users = db.collection("Users");
var currentUser = firebase.auth().currentUser;
var response = users.where('liked', 'array-contains', currentUser.uid);
response.get().then( function (querySnapshot) {
  var match = false;
  querySnapshot.forEach(function(doc) {
      var docData = doc.data();
      if (docData.id == likedId) {
        console.log('you have a match');
        match = true;
      }
  })
  return match;
})

}

, но matchresponse всегда появляется как неопределенное, неважно как я пытаюсь передать значение. Я попытался передать строку, изменив l oop на обычное для l oop, сломав l oop, вернувшись с в l oop, сделав обратный вызов lookForMatches asyn c. Я не уверен, почему это не работает. Обычно я могу просто вернуть значение, пока я «жду» его завершения. что я тут не так делаю?

PS Я могу console.log "у вас есть совпадение", поэтому я знаю, что оно работает.

Ответы [ 2 ]

1 голос
/ 21 января 2020

lookForMatches ничего не возвращает. Вам нужно заставить его вернуть обещание response.get(). Вы возвращаетесь за пределы forEach l oop, но вы все равно возвращаетесь только в обратном вызове .then() вместо общей функции lookForMatches :)

0 голосов
/ 21 января 2020

Ваша lookforMatches функция не return ничего, это ключевое слово return находится внутри обратного вызова к .then(…). Вы должны отбросить это и использовать await вместо:

async function lookForMatches(likedId) {
  const db = firebase.firestore();
  const users = db.collection("Users");
  const currentUser = firebase.auth().currentUser;
  const response = users.where('liked', 'array-contains', currentUser.uid);
  const querySnapshot = await response.get();
  var match = querySnapshot.docs.some(doc => {
    var docData = doc.data();
    return docData.id == likedId;
  });
  if (match) console.log('you have a match');
  return match;
}
...