получать ценность от цепных обещаний - PullRequest
0 голосов
/ 23 ноября 2018

Я действительно новичок в этом из обещаний, и у меня возникают головные боли, пытаясь это понять, поэтому теперь я пытаюсь получить ответ от метода, который возвращает обещание, затем я улавливаю значение в условном выражении и выполняю некоторые другие операции

let addService = async(req, res) => {
    checkCategoryExists(param).then(result => {
        if(result){
           // code here
        }
    }).catch(err => console.log(err));
}


let checkCategoryExists = async(param) => {
    let docs = db.collection(collectionName).doc(param);
    docs.get()
        .then(categoryDoc => {
            if(categoryDoc.exists){
                if(categoryDoc.data().param== param){
                    return true;
                }
            } else {
                return false;
            }
        })
        .catch(err => false);
}

метод "checkCategoryExists" является запросом к базе данных firestore.Когда я попытался проверить, является ли переменная результата истинным или ложным, это происходит с неопределенным.не с ".then ()", что я получаю, чтобы поймать значение из возвращенного обещания?если кто-то может мне помочь, заранее спасибо

1 Ответ

0 голосов
/ 24 ноября 2018

Итак, как уже упоминалось выше, я думаю, что ваша проблема основана на том, что вы не возвращаете результаты поиска в вашем документе, поэтому оба приведенных ниже примера справляются с этим.

Я также заметил, что вы использовали асинхронные теги в своих функциях, но никогда не использовали await, поэтому я хотел привести примеры обоих способов сделать это в случае, если вы хотите использовать Async / Await, но не был уверен, как.

В примере цепочки обещаний я полагаюсь на синтаксис функций стрелок для создания возвращаемых значений (без {} означает возврат правой части уравнения), поскольку ни один из вашего кода не требует манипулирования данными перед возвратом (если ваш реальный код нуждается в этом, вы, конечно, должны использовать квадратные скобки и запомнить выражение возврата: D)

Если вы решите использовать Async / Await, вы можете структурировать код гораздо ближе к синхронным примерам и использовать операторы try catch,Иногда я нахожу этот синтаксис более ясным, если мне приходится много обрабатывать / манипулировать, прежде чем возвращать результат.

Удачи:)!

// Promise Chains
const addService = (req, res) => 
  checkCategoryExists(param)
    .then(result => /* do stuff */)
    .catch(err => console.error(err.message));
  
const checkCategoryExists = param => 
  db.collection(collectionName.doc(param)
    .get()
    .then(categoryDoc => 
      Promise.resolve((categoryDoc.exists && categoryDoc.data().param === param))
    );
    
// OR using Async/Await
const addService async (req, res) => {
  try {
    const catExists = await checkCategoryExists(param);
    if (!catExists) {
      throw new Error('error code');
    }
    
    // Do Stuff.
  } catch (error) {
    console.error(error);
  }
};

const checkCategoryExists = async param => {
  try {
    const docs = await db.collection(collectionName)
      .doc(param)
      .get();
    
    return (docs.exists && docs.data().param === param);
  } catch (error) { 
    console.error(error) 
  }
}
...