Javascript 如何访问通过函数传回的承诺?
我对javascript的承诺还不熟悉,所以感谢您的帮助。我的代码尝试从firebase访问数据库,并将函数中的列表从main_page.js传递到index.js。我在一个承诺中得到了我的结果,我很难获得其中的价值 main_page.js:UniqueCourse函数,用于从firebase检索课程。返回课程列表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 = []
// 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如果你觉得这有帮助,请投票