[英]Why for…of waits for Promise to resolve and .forEach() doesn't?
[英]Why doesn't my javascript promise resolve?
exports.validatePasscode = (req,res) => {
var number = req.body.number || null;
var passcode = parseInt(req.body.passcode) || null;
return _users_helper.validatePasscode(number, passcode).then( () => {
return _users_helper.fetchUserByPhone(number)
}).then(user => {
console.log("abc-abc", user);
}).catch(err => {
console.log(err);
});
}
var fetchUserByPhone = function(number){
return new Promise(function(resolve, reject){
return db.ref('/phones-users/' + number).once('value').then(function(snapshot){
if(snapshot.exists() == false){ return resolve(null); };
return fetchUserById(snapshot.child('user_id').val());
});
});
};
exports.fetchUserByPhone = fetchUserByPhone;
var fetchUserById = function(id){
return new Promise(function(resolve, reject){
return db.ref('/users/' + id).once('value').then(function(snapshot){
if(snapshot.exists()){
var result = snapshot.val();
result.id = id;
console.log("User found result", result); //this prints
resolve(result);
}else{
console.log("User not found");
resolve(null);
}
});
});
}
exports.fetchUserById = fetchUserById;
當我運行此代碼時, User found result
正確打印。 但是, abc-abc
無法打印。 為什么?
這不是新承諾的工作方式,通過電話獲取用戶應為:
var fetchUserByPhone = function(number){
return db.ref('/phones-users/' + number)
.once('value')
.then(function(snapshot){
if(snapshot.exists() == false){
return null;
};
return fetchUserById(snapshot.child('user_id').val());
});
};
按ID提取用戶應為:
var fetchUserById = function(id){
return db.ref('/users/' + id).once('value')
.then(function(snapshot){
if(snapshot.exists()){
var result = snapshot.val();
result.id = id;
console.log("User found result", result); //this prints
return result;
}else{
console.log("User not found");
return null;
}
});
}
當您調用已經返回類型(例如類型)的promise的函數時,無需創建新promise。
由fetchUserByPhone
返回的fetchUserByPhone
未得到解決/拒絕。
由於您的db方法無論如何都返回一個Promise,因此沒有必要創建Promise包裝器。 可能的選擇:
exports.validatePasscode = (req, res) => { var number = req.body.number || null; var passcode = parseInt(req.body.passcode) || null; return _users_helper.validatePasscode(number, passcode).then(() => { return _users_helper.fetchUserByPhone(number) }).then(user => { console.log("abc-abc", user); }).catch(err => { console.log(err); }); } var fetchUserByPhone = function(number) { return db.ref('/phones-users/' + number).once('value').then(function(snapshot) { if (snapshot.exists() == false) { return Promise.reject(null); }; return fetchUserById(snapshot.child('user_id').val()); }); }; exports.fetchUserByPhone = fetchUserByPhone; var fetchUserById = function(id) { return db.ref('/users/' + id).once('value').then(function(snapshot) { if (snapshot.exists()) { var result = snapshot.val(); result.id = id; console.log("User found result", result); //this prints return result; } else { console.log("User not found"); return Promise.reject(null); } }); } exports.fetchUserById = fetchUserById;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.