Используйте l oop внутри asyn c await, чтобы предоставить ошибку eslint - PullRequest
1 голос
/ 04 августа 2020

У меня есть следующий код , который работает , я сейчас настраиваю eslint и получаю следующую ошибку

1. ESLint: iterators/generators require regenerator-runtime, which is too heavyweight for this guide to allow them. Separately, loops should be avoided in favor of array iterations. (no-restricted-syntax)

2. ESLint: Unexpected `await` inside a loop. (no-await-in-loop)

Идея кода следующая:

  1. l oop для глобальных учетных записей, которые содержат список учетных записей (первый для)

  2. подготовить запрос для региона ес

  3. подготовить запрос для региона США

  4. запустить asyn c запрос для получения пользователей из ЕС

  5. l oop по значению и если find url return 6-7, как 4-5, но для региона США

     async function acount(global) {
    
         // here i got the first eslint error iterators/generators
         for (const account of global) {
    
              // create http request for getting the users - region EU
             let usersEUReq = getUsers(account.guid, region.1);
    
             // create http request for getting the users region US
             let usersUSReq = getUsers(account.guid, region.2);
    
             const usersEU = await axios(usersEUReq);
    
           // here I got the response from the promise and should loop on it got get URL
             for (const sub of usersEU.data) {
                 if (sub.url) {
                     return sub.url
                 }
             }
    
             const usersUS = await axios(usersUSBReq);
             for (const sub of usersUS.sub) {
                 if (sub.url) {
                     return sub.url
                 }
             }
     }
    

btw, I не может использовать Promise.all или race как I требуется запуск кода для ЕС, а затем для США

1 Ответ

1 голос
/ 04 августа 2020

Если вы явно не хотите последовательно l oop поверх ожидаемых обещаний, вам следует использовать Promise.all или Promise.race (или Promise.any(), если все основные браузеры поддерживают это). Они будут выполнять ваши обещания одновременно.

Например:

function getuserdata(account) {
    return [region.1, region.2].map(_region => getUsers(account.guid, _region)).map(axios);
}

async function acount(global) {
    let userdata = await Promise.all(global.flatMap(getuserdata))
    for (const sub of userdata) {
        if (sub.url) {
            return sub.url
        }
    }
}

Если вы действительно хотите выполнить серийный номер l oop, то то, что у вас есть, будет работать.

...