V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
shuson
V2EX  ›  JavaScript

代码求助,关于 Proxy Promise Pattern 的使用, javascript 的

  •  
  •   shuson · 2015-06-24 10:25:37 +08:00 · 2647 次点击
    这是一个创建于 3447 天前的主题,其中的信息可能已经有所发展或是发生改变。

    actionA, actionB都返回promise。

    基本逻辑是,actionA的reject要执行actionB,actionB的resolve要执行actionA,此时actionA再reject就error。

    actionA().then(
        function(){//resolve
            //do right thing
        },
        function(){ //handle reject
            actionB().then(function(){
                actionA().then(function(){
                    //do right thing
                },function(){
                //Error Alert from actionA
               })
          },function(){
                //Error Alert from actionB
         })
        }
    )
    

    怎么使用proxy pattern优化上面的code

    第 1 条附言  ·  2015-06-24 11:28:32 +08:00
    更改subject:Proxy Promise Pattern ——> Proxy Pattern with promise
    7 条回复    2015-06-24 13:09:52 +08:00
    lujiajing1126
        1
    lujiajing1126  
       2015-06-24 11:18:01 +08:00
    什么是proxy promise pattern。。。
    shuson
        2
    shuson  
    OP
       2015-06-24 11:29:08 +08:00
    @lujiajing1126 当作是proxy pattern吧,表达不清楚了
    sodatea
        3
    sodatea  
       2015-06-24 11:31:13 +08:00   ❤️ 1
    orz 这个代码风格……
    建议看看周爱民的这篇文章 -> http://www.w3ctech.com/topic/916
    otakustay
        4
    otakustay  
       2015-06-24 11:44:31 +08:00
    如果你确保你的do right thing是不会出错的,或者出错也要用一致的逻辑来处理error,那这个逻辑应该是很简单的:

    var a = actionA();

    a.then(doRightThing); // 正确的

    a.catch(actionB) // 出错后调用actionB
    .then(actionA) // 如果actionB成功就继续actionA
    .then(doRightThing) // actionA成功就doRightThing
    .catch(alertError); // 上面无论哪一步失败都处理错误

    重点在一系列的then过程中,任何一个环节出错,错误都会传到最后近的一个catch上去,所以逻辑的处理是线性的而不是嵌套的
    shuson
        5
    shuson  
    OP
       2015-06-24 11:54:34 +08:00
    @otakustay 感谢你的解决方案, 很有启发。
    但是,我的问题是可否用proxy pattern来重构我那些垃圾的嵌套代码。
    otakustay
        6
    otakustay  
       2015-06-24 12:05:59 +08:00
    @shuson 不明白你的proxy pattern是指经典OO Design Pattern里的Proxy Pattern么,如果是的话,为何要一开始就把“用Proxy Pattern”这明显是“手段”的东西作为重构的“目标”呢?所谓重构不就是保证正确性的前提下把代码理得更顺更易读吗,既然原来Promise就可以达到这样的目标,为何还要引入其它的Pattern
    shuson
        7
    shuson  
    OP
       2015-06-24 13:09:52 +08:00
    @otakustay 因为在actionB里的resolve还要call actionA,这样嵌套的代码很不雅。看到proxy可以解决这一的问题,但是不知道怎么写code
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2124 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 01:01 · PVG 09:01 · LAX 17:01 · JFK 20:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.