Водопад с асинхронностью и ожиданием

Я хочу реализовать водопад с async и ждать.

я прошел через это, попробовал

Основная цель заключается в том, что я хочу, чтобы функция async вызывалась, если какой-либо из вышеуказанных async отклоняется с ошибкой.

var cont = 1;

function signin (){
  console.log(cont);
  // i am doing some async
  return new Promise((a,b)=>{
    if((++cont) === 4){
      setTimeout(1000*cont,b,'ab');      
    } else {
      setTimeout(1000*cont,a,'ab');
    }
  })
}

async function main() {
  try {
    await signin;
    await signin;
    await signin;
    await signin;
    await signin;
    await signin;
    await signin;
    return signin();
  } catch(er){
    return er;
  }
}

main()

В приведенном выше описании ничего не работает должным образом. каков мой ожидаемый результат

1
2
3
4

После четвертого он должен полностью сломаться. А остальные попытки авторизации вызывать не должны.

Все входы в систему должны выполняться последовательно. Как в водопаде.

Любая помощь?


person codeofnode    schedule 29.05.2017    source источник
comment
Разве это не должно быть await signin(); в вашей основной функции, у вас просто await signin;.   -  person Frank Roth    schedule 29.05.2017
comment
почему stackoverflow.com/a/40593103/1503495 не call эти функции? Извините, если это глупо, но я только что начал, асинхронно и жду.   -  person codeofnode    schedule 29.05.2017
comment
даже с await signin(); он не идет после 1.   -  person codeofnode    schedule 29.05.2017
comment
Я не знаю, но ваш код вообще не имеет смысла. setTimeout(1000*cont,b,'ab'); тоже неверен. Первый параметр - это функция, а второй параметр - время в мс. Прочтите: w3schools.com/jsref/met_win_settimeout.asp   -  person Frank Roth    schedule 29.05.2017
comment
К вашему сведению, async/await будет частью ES2017. Это не часть ES7 (ES2016).   -  person Felix Kling    schedule 29.05.2017


Ответы (1)


Вам нужно изменить 2 вещи:

  • параметры функции setTimeout
  • вызвать функцию входа с парантезом, например: await signin ()

      var cont = 1;
      function signin (){
      console.log(cont);
      // i am doing some async
      return new Promise((resolve, reject)=>{
        if((++cont) === 4){
          setTimeout(reject(cont),1000*cont);
        } else {
          setTimeout(resolve(cont),1000*cont);
        }
      })
    }
    
    async function main() {
      try {
        await signin();
        await signin();
        await signin();
        await signin();
        await signin();
        await signin();
        await signin();
        return signin();
      } catch(er){
        console.log("error: " +cont);
        return er;
      }
    }
    
    main()
    
person CBri    schedule 29.05.2017
comment
еще один вопрос, что, если я хочу передать параметр для входа .. Скажите, когда первый вход разрешен с помощью 'hello world', второй вход должен читать это как параметр и добавлять 'второй', чтобы thir signin получил это как ' второй привет, мир '.. и так далее .., не могли бы вы дать мне песочницу .. Я сейчас пробую на babel, но там я не могу найти ссылку для обмена - person codeofnode; 29.05.2017
comment
@codeofnode: async/await позволяет писать код синхронно (до некоторой степени): var result = await signin(); result = await signin('second ' + result); - person Felix Kling; 29.05.2017