Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 有回扣的有棱角的承诺_Javascript_Angularjs_Coffeescript - Fatal编程技术网

Javascript 有回扣的有棱角的承诺

Javascript 有回扣的有棱角的承诺,javascript,angularjs,coffeescript,Javascript,Angularjs,Coffeescript,我需要按顺序执行以下3个函数: getSomeData1: -> @http.get("someRestUrl1") getSomeData2: (param1, param2)-> @http.get("someRestUrl2") getSomeData3: -> @http.get("someRestUrl3") getSomeData1().then(getSomeData2(param1, param2)).then(getSomeData3

我需要按顺序执行以下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中,您可以做一些简单的事情,只需创建一个匿名函数,该函数将首先调用回调函数,然后检索SomeData2:

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

getSomeData1().then(function(){
    normalJsFunction();
   getSomeData2
}).then(getSomeData3)

您可以返回一个承诺,该承诺解析为回调中应在
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)

这种方法的问题在于难以读取/维护。比如说,我们将normalJsFunction()和getSomeData2()组合成一个函数x。然后,我们将得到getSomeData1()。然后是(x)。然后是(getSomeData3)。问题是新函数将同时具有getSomeData1回调和getSomeData2()函数的逻辑。回调和getSomeData2已经链接在一起,因为它们需要一个接一个地执行。因此,在相同的函数X中调用它们是有意义的。它没有添加依赖项,它使两个调用之间的依赖项显式化。函数getSomeData2接受2个参数。因此,它更像getSomeData1().then(x(param1,param2)).then(getSomeData3)。回调函数normalJsFunction()需要访问getSomeData1()的响应。如果我按照您的建议进行重构,我将如何从x内部访问响应。将someData1响应传递给x函数?这一点似乎也很明显。是的,我需要对此进行测试,因为响应不是进入x()的唯一参数。x(响应,参数1,参数2)能工作吗?谢谢。如果我的回调函数不返回任何东西怎么办?只返回一个类似布尔值的伪值:
返回$q.when(true)
我刚刚尝试使用$q.when(true)。在回调()完成之前调用函数getSomeData2()。是的,因为此处立即调用
getSomeData2
getSomeData1()。然后(回调)。然后(getSomeData2(param1,param2))。然后(getSomeData3)
是否使用下划线/lodash?一个好的解决方案可能是部分调用getSomeData2:
getSomeData1().then(回调)。然后(u.partial(getSomeData2,param1,param2))。然后(getSomeData3)