2017-09-05 83 views
1

我碰上这种飘飞:的Javascript模式完成承诺

return somethingThatReturnsAPromise() 
    .then((response) => { 
    soSomethingg(); // Eg; update the UI 
    return response; 
    }); 

现在我正在寻找的东西预计不会返回任何东西,也不会改变的诺言链,如果我忘记即:

return somethingThatReturnsAPromise() 
    .whatImLookingFor((response) => { 
    doSomething(); // Eg; update the UI 
    }) 
    .then((response) => { 
    // and this one should still be able to access response 
    }); 

也许这违背承诺的想法,但对我来说,因为我无法通过任意函数这是一个有点不方便。

一个想法是组成一个功能:

const sideEffect = (callback) => { 
    return (response) => { 
    callback(response); 
    return response; 
    }; 
}; 

而且我可以用它作为

return somethingThatReturnsAPromise() 
    .then(sideEffect(doSomething)); 

但我喜欢的东西,而不是then有类似的东西?

注意:我正在使用Angular 1.x,所以我需要类似的东西。

+0

'sideEffect'是一个完美的解决方案。你不喜欢它什么? – Bergi

回答

2

我会认为你没有真正写.then().then(),因为你可能崩溃说成一个单一的.then,但你的关注实际上是关于返回承诺,有一些外部的代码添加另一个then到链。在这种情况下做到这一点:

let p = somethingThatReturnsAPromise(); 
p.then(() => doSomething()); 
return p; 

这就允许调用附加其他then s到原来的承诺,而不是链接了你.then,从而接收原承诺的价值。这就是所谓的分支的承诺链。

+0

我支持这个答案。 – Bergi

+0

唯一的缺点是我无法控制执行的顺序,但在大多数情况下都没问题。 – fodma1

+0

@ fodma1如果下面的承诺不是真的依赖于之前承诺的回报价值或成功,那么也不应该依赖于它的时间。 – deceze

0

据我所知(我可能是错的)“传递”副作用的包装方法是一种惯用的方式来做你想做的。

或者(如果您需要在多个地方使用相同的response),您可以在遇到类似情况时拆分承诺链。

2

也许这违背承诺

略,许链是管道其中then处理器在每个阶段变换东西的想法。但是想要通过价值不变的方式完全有效。

一个想法是组成一个功能:

事实上的第一件事来考虑,我怎么会做它。

但我喜欢的东西,而不是then有类似的东西?

没有。您可以将它添加到您自己的项目中(我不会在图书馆中),将它添加到Promise.prototype。或者你可以给你一个Promise子类并在那里添加它。

并承诺sublass你会做这样的事情:

return MyPromise.resolve(somethingThatReturnsAPromise()) 
    .thenSide(soSomethingg); // Eg; update the UI 

...其中thenSide是你的方法那是then但通过原始值回不变,如:

class MyPromise extends Promise { 
    thenSide(callback) { 
     this.then(callback); 
     return this; 
    } 
} 

class MyPromise extends Promise { 
    thenSide(callback) { 
     this.then(callback); 
     return MyPromise.resolve(this); 
    } 
} 

...取决于你是否都是约thenSide返回相同的承诺(因为then总是返回一个新的)。

+0

感谢您的详细解答,但@ deceze的答案是我用例中最短,最干净的解决方案。 – fodma1