Home  >  Q&A  >  body text

javascript - node promise问题,如何控制流程?

现在我有step1, step2,step3,step4四个操作,都用promise了
逻辑是只要有一个step成功就返回,不用执行下面的操作,有一个失败,就执行下面的操作,例如,step1失败,执行step2,如果成功,就不用执行下面的step3了


以上操作用promise如何写比较好呢?

天蓬老师天蓬老师2631 days ago630

reply all(6)I'll reply

  • 大家讲道理

    大家讲道理2017-04-11 11:04:04

    成功了reject的方案中,你需要找到一个办法区分成功流程,和代码运行过程中发生的错误。

    比如step3里面出现了一个无法预估的异常,抛出了一个错误,这个时候对正常流程的处理和对异常流程的处理都混在promise给你提供的对异常流程的接口中了。

    不要用异常处理逻辑来做正常处理流程,这个规则保证了代码可读性与可维护性。


    用promise的方案很简单。此外,正常处理流程(console.log("Done"))和异常处理流程(console.error("Done, but all failed"))可以清晰地分辨出:

    console.log("start")
    step1()
        .catch(step2)
        .catch(step3)
        .catch(step4)
        .then(() => console.log("Done"))
        .catch(() => console.error("Done, but all failed"))

    切换step1、step2……的返回就可以查到所有流程:

    function step1(){ console.log(1); return Promise.reject(); }
    function step2(){ console.log(2); return Promise.resolve(); }
    function step3(){ console.log(3); return Promise.resolve(); }
    function step4(){ console.log(4); return Promise.resolve(); }

    reply
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-11 11:04:04

    成功的话就reject。(仅参考,不建议这样写)

    reply
    0
  • PHP中文网

    PHP中文网2017-04-11 11:04:04

    这个情况用async+await大法好

    reply
    0
  • 黄舟

    黄舟2017-04-11 11:04:04

    var p1 = new Promise(function (resolve, reject) {
      // ...
    
    });
    
    var p2 = new Promise(function (resolve, reject) {
      // ...
      resolve(p1);
    })
    

    reply
    0
  • 阿神

    阿神2017-04-11 11:04:04

    嗯 楼上说的对 用 async function 比较方便

    // 假设步骤如下
    const api = 'http://api.hitokoto.cn/?c=a'
    const asyncFunctions = {
      async step1() { return await fetch(api).then(res => res.json()) },
      async step2() { return await fetch(api).then(res => res.json()) },
      async step3() { return await fetch(api).then(res => res.json()) },
      async step4() { return await fetch(api).then(res => res.json()) },
    }
    
    ;(async () => {
      let result = null
      for(let step in asyncFunctions) {
        try {
          result = await asyncFunctions[step]()
          break
        } catch(err) {
          console.error(err)
        }
      }
      console.info(result)
    })()

    reply
    0
  • ringa_lee

    ringa_lee2017-04-11 11:04:04

    说用race的应该是没理解需求,需求是说,step1如果失败才执行step2,如果用race就都会执行了。
    @不爱吃西红柿的鱼

    reply
    0
  • Cancelreply