簡體   English   中英

如何一次使用節點js中三個不同API調用的響應

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM