Функция asyn c await не меняет переменную после второго запроса? - PullRequest
0 голосов
/ 13 января 2020


Итак, у меня проблемы с функциями ASYN C AWAIT .
вот что я делаю:


У меня есть этот асин c функция, которая использует await, например, getuserdata

// I am trying to check multiple users as much as possible basically.
getuserdata("Swift")
getuserdata("someotherperson")

async function getuserdata(username){
  //inside this I have 2 await functions which await a value from 2 different async functions. for example: user balance and user id
var userbalance = await getuserbalance(username)
var userid = await getuserid(username)
console.log(username + " has " + userbalance + " as balance and their user ID is: " userid)
//Now let's say we want to check 2 users a few times a minute to keep their balance up to date, so we run the function again
getuserdata(username)
}

//but in both of the functions (getuserbalance and getuserid) I have a web request which also uses await
// here's an example
async function getuserbalance(username){
    var request = await axios({
        url: "https://example.com/api/userbalance.php?username="+username,
        method: "GET"
    })
    return request.data
}

async function getuserid(username){
    var request = await axios({
        url: "https://example.com/api/userid.php?username="+username",
        method: "GET"
    })
    return request.data
}

Теперь эта ошибка возникает в первые 2 раза, и это прекрасно работает для меня. Таким образом, первые 2 раза это будет показано в консоли:

Swift имеет 100 в качестве баланса и их ID пользователя: 1
someotherperson имеет 4 в качестве баланса и их ID пользователя: 2

Но после 2 запусков он просто продолжает показывать это:

someotherperson имеет 4 в качестве баланса и их ID пользователя: 2

Но затем, после примерно 15 запросов, он снова переключается на первый. поэтому он будет повторять:

Swift имеет 100 в качестве баланса, а их идентификатор пользователя: 1

Для около 15 запросов, а затем снова переключается. Есть ли способ сделать так, чтобы оно каждый раз обновляло значение?

Спасибо, что прочитали это.

1 Ответ

0 голосов
/ 13 января 2020

Это может удовлетворить ваши требования. Пожалуйста, замените БД вашими вызовами API

db = {'p1': {'balance': 300, 'id': 1}, 'p2': {'balance': 540, 'id': 2}, 'p3': {'balance': 800, 'id': 3}}
users = ['p1', 'p2', 'p3'];
tries_per_each_employee = 2;

(async () => {
   // Parallel way of testing for multiple Employees
   await Promise.all(users.map(p => getuserdata(p, tries_per_each_employee))).then(() => console.log('Done Checking all Users in Parallel.'));
   
   // Synchronous Way
   for(let u of users) {
      await getuserdata(u, tries_per_each_employee);
   }
   console.log('Done Checking all Users in Series.');
})();

async function getuserdata(username, tries){
    const userbalance = await getuserbalance(username)
    const userid = await getuserid(username)
    console.log(username + " has " + userbalance + " as balance and their user ID is: " + userid)

    tries <= 1 ? Promise.resolve() : await getuserdata(username, tries - 1);
}

async function getuserbalance(username){
    return db[username].balance;
}

async function getuserid(username){
    return db[username].id;
}
...