【问题标题】:Waterfall with async and await带有异步和等待的瀑布
【发布时间】:2017-10-29 14:31:35
【问题描述】:

我想用 async 和 await 实现瀑布。

我通过this尝试了一些操作

主要目的是如果上述任何一个异步拒绝错误,我确实想调用异步函数。

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

在第四个之后,它应该一直中断。并且不应调用其余的登录尝试。

所有登录必须按顺序执行。就像瀑布一样。

有什么帮助吗?

【问题讨论】:

  • 不应该是await signin();在你的主要功能你只有await signin;。
  • 为什么stackoverflow.com/a/40593103/1503495 没有call 那些功能?对不起,如果这很愚蠢,但我刚刚开始,异步并等待。
  • 即使使用await signin();,它也不会出现在 1 之后。
  • 我不知道,但您的代码根本没有任何意义。 setTimeout(1000*cont,b,'ab'); 也是错误的。第一个参数是函数,第二个参数是以毫秒为单位的时间。请阅读:w3schools.com/jsref/met_win_settimeout.asp
  • 仅供参考,async/await 将成为 ES2017 的一部分。它不是 ES7 (ES2016) 的一部分。

标签: javascript asynchronous ecmascript-2017


【解决方案1】:

你需要改变的两件事:

  • 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()
    

【讨论】:

  • 还有一个问题,如果我想将参数传递给登录怎么办。说当第一次登录用“hello world”解决时,第二次登录应该将其读取为参数并在前面加上“第二次”所以他们的登录应该收到“第二个你好世界”..等等..,你能给我一个沙箱吗..我目前正在做 babel 尝试,但我无法找到共享链接跨度>
  • @codeofnode: async/await 让您以同步方式(在某种程度上)编写代码:var result = await signin(); result = await signin('second ' + result);
猜你喜欢
  • 2013-10-24
  • 2013-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-25
  • 2015-07-18
  • 2017-02-23
  • 2016-06-22
相关资源
最近更新 更多