V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
miv
V2EX  ›  问与答

Promise(axios)的问题请教

  •  
  •   miv · 2020-06-15 09:57:36 +08:00 · 1374 次点击
    这是一个创建于 1640 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如题,遇到一个棘手的问题,基础不扎实的我来请教一下。

    是这样的需要实现一个功能伪代码如下

    if(情况 A ){
    	axios 请求接口 A.then(res=>){
        	if(xxx){
            	return //这里的 return 无法结束下面情况 B 和情况 C,还是会继续执行,因为这里是异步
            }
        }
    }
    
    if(情况 B ){
    	...
    }else if(情况 C ){
    	...
    }
    

    现在的问题是,axios 请求接口 A 的数据只可以使用 then 异步获取结果。 如果条件不满足就不执行后面其他情况(情况 B 和情况 C )的代码了。 可是由于情况 A 是异步的,所以不管怎么样情况 B 和 C 都会执行,我不需要这一种情况,需要怎么处理呢?

    第 1 条附言  ·  2020-06-15 11:03:08 +08:00
    用推荐的 async 和 await 拒绝问题了
    在情况 A,使用 axios 的地方是用了 await,等待返回结果。
    再次多谢提供帮助的老哥们,非常感谢,涨知识了。
    10 条回复    2020-06-15 12:33:25 +08:00
    BearD01001
        1
    BearD01001  
       2020-06-15 10:04:40 +08:00 via iPhone   ❤️ 1
    不用 async 的情况下可以在 then 中 throw 一个 error 然后用 catch 实现
    FEDT
        2
    FEDT  
       2020-06-15 10:05:36 +08:00   ❤️ 1
    把 情况 B 和情况 C 放到 then 的回调函数里不就可以了么...
    miv
        3
    miv  
    OP
       2020-06-15 10:08:04 +08:00
    @BearD01001 好的,太感谢了,我尝试下。
    miv
        4
    miv  
    OP
       2020-06-15 10:10:35 +08:00
    @FEDT 是这样的,改动成本有点大,因为满足情况 A 才执行对应的代码。这样的话就会多一份代码在回调函数里面了,有点冗余
    otakustay
        5
    otakustay  
       2020-06-15 10:29:40 +08:00   ❤️ 1
    如果 if 里的条件是 A 接口返回才知道的,那么除了把 B 和 C 放进 A 的 then 里以外没有任何办法
    代码改造成 await 的话改起来没什么成本,反正外部调用肯定是认定返回值是 Promise 吧
    Exin
        6
    Exin  
       2020-06-15 10:35:53 +08:00 via iPhone   ❤️ 1
    1. 推荐 async/await

    ```js
    if (A) {
    const res = await requestA(...)
    if (xxx) return
    }

    if (B) ...
    else if (C) ...
    ```

    2. Promise.resolve

    ```js
    Promise.resolve(A ? requestA(...).then(res => xxx ? true : false) : false)
    .then(escapedFromA => {
    if (!escapedFromA) {
    if (B) ...
    else if (C) ...
    }
    })
    ```
    Exin
        7
    Exin  
       2020-06-15 10:36:56 +08:00 via iPhone
    v2 回复是不是不支持 markdown ?
    miv
        8
    miv  
    OP
       2020-06-15 10:45:42 +08:00 via iPhone
    @otakustay 多谢老哥

    @Exin 多谢老哥
    我尝试下
    godgc
        9
    godgc  
       2020-06-15 12:33:03 +08:00
    @Exin v2 应该是要```javascript 吧

    e.g

    ```javascript
    let foo = 'bar';
    ```
    godgc
        10
    godgc  
       2020-06-15 12:33:25 +08:00
    @Exin 惨..也不行
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2849 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 12:43 · PVG 20:43 · LAX 04:43 · JFK 07:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.