如何避免这个小小的回调地狱

how can avoid this little callback hell

提问人:Ivan Paredes 提问时间:4/11/2018 最后编辑:Ivan Paredes 更新时间:4/12/2018 访问量:174

问:

如何避免这个小小的回调地狱?此代码工作正常

        estaElServicioDespachado(15).then(function(){
            sePermiteModificarElCupon(25).then(function(respuesta){
                $state.go("barra.general.formularioCupon");
            },function(error){                   
                alert(error);
            })
        },
        function(error){               
            alert(error);
        });

我试图做这样的事情来避免回调地狱,但是当“sepermitemodificarElcupon”拒绝时,它不会调用 catch 函数

    estaElServicioDespachado(15)
        .then(sePermiteModificarElCupon(25)}
        .then(function(){$state.go("barra.general.formularioCupon");})
        )
        .catch(function(error){               
            alert(error);
        })

也许这会有所帮助。这是调用返回 promise 的服务函数的函数

    function estaElServicioDespachado (id_servicio){
        return catalogoServicios.estaElServicioDespachado(id_servicio)
    }


    function sePermiteModificarElCupon(id_cupon){
        return catalogoCupones.sePermiteModificarElCupon(id_cupon);
    }
angularjs 回调 angular-promise

评论

0赞 Sravan 4/11/2018
您想添加而不是回调吗?catch
0赞 Ivan Paredes 4/11/2018
不,我想使用第二种形式,但它不起作用。
0赞 Aluan Haddad 4/11/2018
你忘记了应许的基本规则。!!!!否则,它永远不会起作用。return
0赞 Ivan Paredes 4/11/2018
但是我必须在哪里添加退货?
0赞 Aluan Haddad 4/11/2018
来自每个函数,除非它都是同步的并且不返回值。

答:

1赞 Taki 4/12/2018 #1

你要找的词是:Promise.all()

像这样链接你的承诺:

var promise1 = estaElServicioDespachado(15)
var promise2 = sePermiteModificarElCupon(25)

Promise.all([promise1, promise2])
.then(function(){$state.go("barra.general.formularioCupon");})
.catch(reason => {          
    console.log(reason)
})

MDN的例子(添加了一个被拒绝的捕获承诺):

let promise1 = Promise.resolve(3);
let promise2 = new Promise(function(resolve, reject) {
  setTimeout(resolve, 1000, 'foo');
});
let promise3 = 42;

let promise4 = Promise.reject('something went wrong in 4th promise');

// all goes well
Promise.all([promise1, promise2, promise3])
.then(function(values) {
  console.log(JSON.stringify(values));
})
.catch((err) => { console.log(err) });

// an error thrown in the middle
Promise.all([promise1, promise2, promise4, promise3])
.then(function(values) {
  console.log(JSON.stringify(values));
})
.catch((err) => { console.log(err) });