[英]How to use response from three different API calls in node js at one time
我正在嘗試使用nodeJS創建一個Web應用程序,但由於nodeJS的異步特性,我陷入了困境。
我有三種不同的環境,並且基於html表單中的用戶輸入,我應該檢查所選環境中是否存在用戶。
HTML將具有3個復選框,用戶可以選擇任意數量的環境。
if(Dev_Environmnet){
getUserDatafromEnvironment(user,environment, function(callback1)){
if(callback1.error){
// User Does Not Exist Or credentials are wrong
}
else{
//get User API
}
});
}
if(PVS_Environmnet){
getUserDatafromEnvironment(user,environment, function(callback1)){
if(callback1.error){
// User Does Not Exist Or credentials are wrong
}
else{
//get User API
}
});
}
if(Prod_Environmnet){
getUserDatafromEnvironment(user,environment, function(callback1)){
if(callback1.error){
// User Does Not Exist Or credentials are wrong
}
else{
//get User API
}
});
}
完成此操作后,我需要回調中的結果才能將其打印到另一個HTML頁面。 這是我需要在下一頁顯示的內容
DEV - API key gdeuysgdsgddiudgqwywdgAguiegdhsiw
pVS - user does not exist or credentials are wrong
Prod - APYI Key ugehdfiyugfugew%$%$udisfiuhygyig
我無法一次獲得所有這些值。 有人能幫我嗎?
不知道你所說的“讓他們一次,”如果你的意思是“當所有3個異步操作完成知道”的意思,那么你可以這樣幾個方法,建議你考慮將你的異步方法為承諾( 怎么辦我將現有的回調API轉換為promise? ),然后使用Promise.all或使用async和await進行查看。
根據您的偽代碼,類似這樣。
// I assume that you need special functions to get the information
// from different providers.
function getUserFromPVS(user) {
return new Promise( (resolve, reject) => {
// special code to get user from PVS
return resolve(userdata);
});
}
function getUserFromDev(user) {
return new Promise( (resolve, reject) => {
// special code to get user from Dev
return resolve(userdata);
});
}
function getUserFromProd(user) {
return new Promise( (resolve, reject) => {
// special code to get user from Prod
return resolve(userdata);
});
}
// Converted the call to getUserDatafromEnvironment so it is a promise.
function getUserData(flagSelected, user, environment, req) {
return new Promise( (resolve, reject) => {
if (!flagSelected) return resolve(null); // Returns null if not selected
getUserDatafromEnvironment(user,environment, (cb) => {
if (cb.error) {
return resolve(null); // Return NULL instead of rejecting.
} else {
// Call to promise that return user information
// I assume you need different functions for
// each provider
return resolve( req(user) )
}
})
});
}
Promise.all([
getUserData( PVS_Environmnet, user, environment, getUserFromPVS ),
getUserData( Dev_Environmnet, user, environment, getUserFromDev ),
getUserData( Prod_Environmnet, user, environment, getUserFromProd ),
]).then( (results) => {
// results[0] has result from Dev or is null
// results[1] has result from PVS or is null
// results[2] has result from Prod or is null
}).catch(
(error) => console.error(error)
)
首先,可以包裝getUserDatafromEnvironment
以便它返回Promise
:
function getUserDatafromEnvironmentP(flag, user, environment) {
if (!flag) return Promise.resolve(undefined); // method not selected
return new Promise(function(resolve) {
getUserDatafromEnvironment(user, environment, function(callback) {
resolve(!callback.error);
})
});
}
然后,您可以調用您的三個方法,並將它們傳遞給Promise.all()
,它將等到所有三個方法都完成並告訴您結果之后:
let p1 = getUserDatafromEnvironmentP(Dev_Environmnet, user, environmnet);
let p2 = getUserDatafromEnvironmentP(PVS_Environmnet, user, environmnet);
let p3 = getUserDatafromEnvironmentP(Prod_Environmnet, user, environmnet);
let result = Promise.all([p1, p2, p3]).then(
function(results) {
// results[0 .. 2] will contain the three results
// undefined for "not used", false for "failed", true for "ok"
.. continue with processing here
})
);
// you can't do anything useful here because the above code is async
注意:通常,我會皺着眉頭使用resolve
來表示失敗,但是在這種情況下,由於隨后使用Promise.all()
似乎很合適。
您應該在以前的回調中保留對其他檢查的調用:
checkOne(someArgs, (callback) => {
let checkOneResult = true;
if (callback.error)
checkOneResult = false;
checkTwo(someArgs, (callback) => {
let checkTwoResult = true;
if (callback.error)
checkTwoResult = false;
//here I got result from both checks:
console.log(checkOneResult);
console.log(checkTwoResult);
});
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.