【问题标题】:Angular Promises with callbacks带有回调的 Angular Promise
【发布时间】:2015-07-09 18:40:31
【问题描述】:

我需要按顺序执行以下 3 个函数:

getSomeData1: ->
    @http.get("someRestUrl1")
getSomeData2: (param1, param2)->
    @http.get("someRestUrl2")
getSomeData3: ->
    @http.get("someRestUrl3")

getSomeData1().then(getSomeData2(param1, param2)).then(getSomeData3)

现在,如果我想在调用函数 getSomeData2 之前将回调附加到函数 getSomeData1,最好的方法是什么?

新回调不包含任何 $http 请求。这是一个普通的javascript函数。

【问题讨论】:

    标签: javascript angularjs coffeescript


    【解决方案1】:

    我不是咖啡师,但在普通的 javascript 中,您可以做一些简单的事情,只需创建一个匿名函数,该函数将首先调用您的回调,然后检索 SomeData2:

    getSomeData1: ->
        @http.get("someRestUrl1")
    getSomeData2: ->
        @http.get("someRestUrl2")
    getSomeData3: ->
        @http.get("someRestUrl3")
    
    getSomeData1().then(function(){
        normalJsFunction();
       getSomeData2
    }).then(getSomeData3)
    

    【讨论】:

    • 这种方法的问题是难以阅读/维护。假设我们将 normalJsFunction() 和 getSomeData2() 组合成一个函数 x。然后,我们将得到 getSomeData1().then(x).then(getSomeData3)。问题是新函数将具有 getSomeData1 回调和函数 getSomeData2() 的逻辑。
    • 回调和getSomeData2已经链接在一起了,因为它们需要一个接一个地执行。所以在同一个函数中调用它们 X 是有意义的。它不添加依赖关系,它使两个调用之间的依赖关系显式。
    • 好的,我已经编辑了问题以反映实际情况。函数 getSomeData2 接受 2 个参数。所以,它更像是 getSomeData1().then(x(param1, param2)).then(getSomeData3)。回调函数 normalJsFunction() 需要访问 getSomeData1() 的响应。如果我按照您的建议进行重构,我将如何从 x 内部访问响应。
    • 将 someData1 响应传递给 x 函数?那个似乎也很明显。
    • 是的,我需要对此进行测试,因为响应不是进入 x() 的唯一参数。 x(response, param1, param2) 会起作用吗?
    【解决方案2】:

    您可以返回一个 Promise,它解析为回调中的一个值,该值应在 getSomeData2 之前调用。我不知道 CoffeeScript,我假设 $q 服务可用:

    getSomeData1: ->
        @http.get("someRestUrl1")
    getSomeData2: (param1, param2)->
        @http.get("someRestUrl2")
    getSomeData3: ->
        @http.get("someRestUrl3")
    
    function callback(data) {
        return $q.when(callbackReturnValue) 
    }
    
    getSomeData1().then(callback).then(getSomeData2(param1, param2)).then(getSomeData3)
    

    【讨论】:

    • 谢谢。如果我的回调函数没有返回任何东西怎么办?
    • 只返回一个像布尔值这样的虚拟值:return $q.when(true)
    • 我刚刚尝试使用 $q.when(true)。函数 getSomeData2() 在 callback() 完成之前被调用。
    • 是的,因为这里会立即调用getSomeData2getSomeData1().then(callback).then(getSomeData2(param1, param2)).then(getSomeData3) 你使用下划线/lodash 吗?一个好的解决方案可能是对 getSomeData2 进行部分调用:getSomeData1().then(callback).then(_.partial(getSomeData2, param1, param2)).then(getSomeData3)
    猜你喜欢
    • 2021-01-28
    • 2016-09-16
    • 2019-11-27
    • 2019-10-30
    • 2015-11-13
    • 2012-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多