Как получить доступ к обещанию, переданному через функцию? - PullRequest
1 голос
/ 10 октября 2019

Я новичок в обещаниях на JavaScript, так что спасибо за любую помощь. Мой код пытается получить доступ к базе данных из firebase и передать список в функции из main_page.js в index.js. Я возвращаю свой результат в обещании, и мне трудно получить доступ к значению в пределах.

main_page.js: функция UniqueCourse для извлечения курса из базы данных. Возвращает список курсов

    // Get Unique Course ID
    function UniqueCourse(t_id){
      var courseArray = []
      return Promise.resolve(
        firebase.database().ref('/users').once('value',

        function(snapshot) {
          details = snapshot.val()
          //console.log(snapshot.val());

         for (var key in details) {
            if (details.hasOwnProperty(key)) {
              //console.log(key + " , " + details[key].username + "\n");
              if (details[key].username == t_id){
                console.log("Details of Array " + details[key].courses.split(','));
                courseArray = details[key].courses.split(',');
                return courseArray
              }
            }
          }
        })
      ).then(function(value){
        return value;
      })
    }

main_page.js: функция экспорта UniqueCourse для использования вне

    module.exports.UniqueCourse = (t_id) => {
        return UniqueCourse(t_id)
    }

index.js:Взять список, переданный из функции UniqueCourse в main_page.js

    Promise.resolve(main_page.UniqueCourse(req.body.username)).then(function(value){
      console.log(value);
     })

console.log (значение) из index.js должен содержать список курсов из UniqueCourse (t_id). Тем не менее, я получаю объект обещания, показанный в console.log (value). Мне трудно получить доступ к списку из объекта обещания.

Консольный вывод

    Details of Array CZ4047,CZ3003

    DataSnapshot {
      node_:
       ChildrenNode {
         children_:
          SortedMap { comparator_: [Function: NAME_COMPARATOR], root_: [LLRBNode] },
         priorityNode_:
          ChildrenNode {
            children_: [SortedMap],
            priorityNode_: null,
            indexMap_: [IndexMap],
            lazyHash_: '' },
         indexMap_: IndexMap { indexes_: [Object], indexSet_: [Object] },
         lazyHash_: null },
      ref_:
       Reference {
         repo:
          Repo {
            repoInfo_: [RepoInfo],
            app: [FirebaseAppImpl],
            dataUpdateCount: 2,
            statsListener_: null,
            eventQueue_: [EventQueue],
            nextWriteId_: 1,
            interceptServerDataCallback_: null,
            onDisconnect_: [SparseSnapshotTree],
            persistentConnection_: [PersistentConnection],
            stats_: [StatsCollection],
            server_: [PersistentConnection],
            statsReporter_: [StatsReporter],
            transactionQueueTree_: [Tree],
            infoData_: [SnapshotHolder],
            infoSyncTree_: [SyncTree],
            serverSyncTree_: [SyncTree],
            __database: [Database] },
         path: Path { pieces_: [Array], pieceNum_: 0 },
         queryParams_:
          QueryParams {
            limitSet_: false,
            startSet_: false,
            startNameSet_: false,
            endSet_: false,
            endNameSet_: false,
            limit_: 0,
            viewFrom_: '',
            indexStartValue_: null,
            indexStartName_: '',
            indexEndValue_: null,
            indexEndName_: '',
            index_: PriorityIndex {} },
         orderByCalled_: false },
      index_: PriorityIndex {} }

Ожидаемый консольный вывод

    Details of Array CZ4047,CZ3003

    [CZ4047,CZ3003]

Ответы [ 4 ]

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

У меня небольшой опыт работы с firebase, но я думаю, что вы могли бы переписать ваш запрос на

function UniqueCourse(t_id) {
    return firebase.database()
        .ref('/users')
        .orderByChild('username').equalTo(t_id)
        .child('courses')
        .once('value')
        .then(snapshot => snapshot.exists() ? 
            snapshot.val()[0].split(",") : 
            []
         );
}

Поэтому вы не загружаете всех своих пользователей, просто чтобы получить строку для одного из них. Вместо этого вы загружаете только те данные, которые вам нужны;курсы для пользователей, которые соответствуют фильтру.

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

РЕШЕНИЕ

Проблема решена путем перемещения логики в конец обещания на снимке данных Firebase.

    // Get Unique Course ID
    function UniqueCourse(t_id){
      var courseArray = []
      return Promise.resolve(
        firebase.database().ref('/users').once('value',function(snapshot) {})
        ).then(function(snapshot){

        details = snapshot.val();
        //console.log(snapshot.val());

        for (var key in details) {
          if (details.hasOwnProperty(key)) {
            //console.log(key + " , " + details[key].username + "\n");
            if (details[key].username == t_id){
              console.log("Details of Array " + details[key].courses.split(','));
              courseArray = details[key].courses.split(',');
            }
          }
        }
        return courseArray;
        })
    }
0 голосов
/ 10 октября 2019

Если вы имеете дело с обещаниями, вы можете избежать цикла .then, используя async/await. Для использования async / await используйте babel для переноса кода в поддерживаемую версию вашей версией Node.

// Get Unique Course ID
    function sync UniqueCourse(t_id){
      var courseArray = []
      const snapshot = await firebase.database().ref('/users').once('value')
      const details = snapshot.val();
      for (var key in details) {
          if (details.hasOwnProperty(key)) {
            //console.log(key + " , " + details[key].username + "\n");
            if (details[key].username == t_id){
              console.log("Details of Array " + details[key].courses.split(','));
              courseArray = details[key].courses.split(',');
            }
          }
        }
      return courseArray
    }
0 голосов
/ 10 октября 2019

Согласно документации firebase , метод once возвращает Promise<DataSnapshot>

return Promise.resolve(
    firebase.database().ref("xxx").once(function () { /* ..logic.. */ })
).then(function (value) { // this is 'DataSnapshot'
    return value;
})

. Вы получаете значение из DataSnapshot и возвращаете, как показано ниже

return Promise.resolve(
    firebase.database().ref("xxx").once(function () { /* ..logic.. */ })
).then(function (snapshot) {
    return snapshot.val(); // I believe this is syntax. please check the docs
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...