Javascript 如何访问通过函数传回的承诺?

Javascript 如何访问通过函数传回的承诺?,javascript,node.js,function,express,promise,Javascript,Node.js,Function,Express,Promise,我对javascript的承诺还不熟悉,所以感谢您的帮助。我的代码尝试从firebase访问数据库,并将函数中的列表从main_page.js传递到index.js。我在一个承诺中得到了我的结果,我很难获得其中的价值 main_page.js:UniqueCourse函数,用于从firebase检索课程。返回课程列表 // Get Unique Course ID function UniqueCourse(t_id){ var courseArray = []

我对javascript的承诺还不熟悉,所以感谢您的帮助。我的代码尝试从firebase访问数据库,并将函数中的列表从main_page.js传递到index.js。我在一个承诺中得到了我的结果,我很难获得其中的价值

main_page.js:UniqueCourse函数,用于从firebase检索课程。返回课程列表

    // 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;
      })
    }
    Promise.resolve(main_page.UniqueCourse(req.body.username)).then(function(value){
      console.log(value);
     })
main_page.js:导出要在外部使用的UniqueCourse函数

    module.exports.UniqueCourse = (t_id) => {
        return UniqueCourse(t_id)
    }
index.js:获取从主页面.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;
      })
    }
    Promise.resolve(main_page.UniqueCourse(req.body.username)).then(function(value){
      console.log(value);
     })

index.js中的console.log(值)应该包含UniqueCourse(t_id)中的课程列表。然而,我得到的是console.log(value)上显示的promise对象。我很难从promise对象访问列表

控制台输出

    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]
预期控制台输出

    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]

根据,
一次
方法返回一个
承诺

return Promise.resolve(
firebase.database().ref(“xxx”).once(函数(){/*…逻辑..*/})
).then(函数(值){//这是'DataSnapshot'
返回值;
})
您从DataSnapshot获取值,并返回如下所示

return Promise.resolve(
firebase.database().ref(“xxx”).once(函数(){/*…逻辑..*/})
).then(功能(快照){
return snapshot.val();//我相信这是语法,请检查文档
})
根据,方法返回一个
承诺

return Promise.resolve(
firebase.database().ref(“xxx”).once(函数(){/*…逻辑..*/})
).then(函数(值){//这是'DataSnapshot'
返回值;
})
您从DataSnapshot获取值,并返回如下所示

return Promise.resolve(
firebase.database().ref(“xxx”).once(函数(){/*…逻辑..*/})
).then(功能(快照){
return snapshot.val();//我相信这是语法,请检查文档
})

解决方案

通过将逻辑移到firebase数据快照上promise的后面,可以解决此问题

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

解决方案

通过将逻辑移到firebase数据快照上promise的后面,可以解决此问题

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

如果您正在处理承诺,则可以使用
async/await
避免
循环。要使用async/await,请使用babel将代码传输到节点版本支持的版本

// 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
    }

如果您正在处理承诺,则可以使用
async/await
避免
循环。要使用async/await,请使用babel将代码传输到节点版本支持的版本

// 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
    }

我对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(",") : 
            []
         );
}

因此,您并不是下载所有用户,只是为了获得其中一个用户的字符串。相反,你只下载你想要的实际数据;符合筛选条件的用户的课程。

我对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(",") : 
            []
         );
}

因此,您并不是下载所有用户,只是为了获得其中一个用户的字符串。相反,你只下载你想要的实际数据;符合筛选条件的用户课程。

不要在答案中添加“已解决”部分。堆栈溢出不是这样工作的。问题的答案应该在答案部分。如果你自己有一个答案不是已经发布的,那么你自己发布一个。这在堆栈溢出时是可以接受的。您承诺的原因是什么?解决(另一个承诺)
?不要在答案中添加“已解决”部分。堆栈溢出不是这样工作的。问题的答案应该在答案部分。如果你自己有一个答案不是已经发布的,那么你自己发布一个。这在堆栈溢出时是可以接受的。您承诺的原因是什么?解决(另一个承诺)
?@ChristopherTan如果您觉得这有帮助,请upvote@ChristopherTan如果你觉得这有帮助,请投票