Как ждать получения данных из облачного хранилища и затем возвращать их в NodeJS? - PullRequest
0 голосов
/ 15 апреля 2020

Я хочу получить некоторые данные из облачного хранилища, а затем вернуть эти данные на карту. Проблема в том, что система возвращает значение до того, как оно будет выбрано, и обещание находится на рассмотрении. Я перепробовал много вещей, но не смог решить проблему. Было бы здорово, если бы кто-то мог помочь мне с этим!

function homepage(formData) {
    var cfire = cfirebase.firestore().collection('Details').doc('dsadsadasdsadasdsdsdasd');

    const test = cfire.get().then(doc => {
        if (doc.exists) {
            Name = doc.data().dd.dn;
            vehical = doc.data().dd.vn;
            vehicalNumber = doc.data().dd.vno;
            console.log(Name, vehical, vehicalNumber);
        } else if (!doc.exists) {
            console.log("Detail does not exist");
            return Promise.reject(new Error('Detail does not exist'));
        } else {
            throw Promise.reject(new Error('Server error!'));
        }
    }).catch(e => {
        return false
    });
    return {
        tripID: {
            c: false,

            dd: {
                // Driver name 
                dn: Name,
                // Vehical name
                vn: vehical,
                // Vehical number
                vno: vehicalNumber,
            }
        }
    };
}

Ответы [ 3 ]

2 голосов
/ 15 апреля 2020

Причина, по которой ваша функция возвращает объект, прежде чем вы извлекаете данные из облачного пожарного хранилища, заключается в том, что cfirebase.firestore().collection(...).doc(...) является асинхронным и возвращает Promise, поэтому вам нужно дождаться разрешения этого Promise, прежде чем вы вернете окончательный вариант. объект.

Вам следует прочитать asynchronous programming, если вы не знакомы с концепцией:

Я предлагаю вам изменить функцию homepage, чтобы она возвращала Promise, или использовать async/await для ожидания разрешения cfire.get() с некоторым значением, прежде чем return конечный объект.

Опция # 1

function homepage(formData) {
  const cfire = cfirebase.firestore().collection(...).doc(...)

  return cfire.get()
    .then(doc => {
      if (!doc) {
        throw new Error("Server error")
      }
      if (!doc.exists) {
        throw new Error("Details does not exist")
      }
      // ...
      return { Name, vehical, vehicalNumber }
    })
    .then(result => {
      // result => { Name, vehical, vehicalNumber }
      // ...
      return {
        tripId: {...}
      }
    })
}
// then
homepage(...)
  .then(result => {...})
  .catch(error => {...})

Опция # 2

Для использования async/await необходимо иметь Node.js 8.x или выше.

async function homepage(formData) {
  try {
    const cfire = cfirebase.firestore().collection(...).doc(...)

    const doc = await cfire.get()

    if (!doc) {
      throw new Error("Server error")
    }

    if (!doc.exists) {
      throw new Error("Details does not exist")
    }

    // ...
    return {
      tripID: {...}
    }
  } catch(error) {
    throw error
  }
}
// then
homepage(...)
  .then(result => {...})
  .catch(error => {...})

Подробнее о async/await:

Надеюсь, что это помогает.

0 голосов
/ 15 апреля 2020

Вы можете сделать это

function homepage(formData) {
    return new Promise((resolve, reject) => {
        var cfire = cfirebase.firestore().collection('Details').doc('dsadsadasdsadasdsdsdasd');
        var returnObj = {
            tripID: {
                c: false,
                dd: {
                    // Driver name 
                    dn: '',
                    // Vehical name
                    vn: '',
                    // Vehical number
                    vno: '',
                }
            }
        }

        const test = cfire.get().then(doc => {
            if (doc.exists) {
                returnObj.tripID.dd.dn = doc.data().dd.dn;
                returnObj.tripID.dd.vn = doc.data().dd.vn;
                returnObj.tripID.dd.vno = doc.data().dd.vno;
                console.log('returnObj => ', returnObj);
                resolve(returnObj);
            } else if (!doc.exists) {
                console.log("Detail does not exist");
                reject('Detail does not exist');
            } else {
                reject('Server error!');
            }
        }).catch(e => {
            reject('Server error!');
        });
    });
}

и вызвать функцию следующим образом

homepage().then((res) => {
    console.log('res => ', res);
}).catch((err) => {
    console.log(err)
});
0 голосов
/ 15 апреля 2020

Это из-за асинхронной природы JS. Напишите свои операторы возврата в блоке «.then».

function homepage(formData) {
     var cfire = cfirebase.firestore().collection('Details').doc('dsadsadasdsadasdsdsdasd');

  const test = cfire.get().then(doc => {
    if (doc.exists) {
        Name = doc.data().dd.dn;
        vehical = doc.data().dd.vn;
        vehicalNumber = doc.data().dd.vno;
        console.log(Name, vehical, vehicalNumber);
         return {
                 tripID: {
                    c: false,

                    dd: {
                       // Driver name 
                          dn: Name,
                         // Vehical name
                         vn: vehical,
                        // Vehical number
                        vno: vehicalNumber,
                    }
               }
           };
    } else if (!doc.exists) {
        console.log("Detail does not exist");
        return Promise.reject(new Error('Detail does not exist'));
    } else {
        throw Promise.reject(new Error('Server error!'));
    }
}).catch(e => {
    return false
});

}

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