Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/473.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 如何处理嵌套jquery延迟调用_Javascript_Jquery_Backbone.js_Jquery Deferred - Fatal编程技术网

Javascript 如何处理嵌套jquery延迟调用

Javascript 如何处理嵌套jquery延迟调用,javascript,jquery,backbone.js,jquery-deferred,Javascript,Jquery,Backbone.js,Jquery Deferred,我有一个函数来获取一些数据,这个函数应该返回一个承诺。在函数中,我必须提出两个请求-一个接一个。我最后得到了一个嵌套的延迟器调用,其中最后一个调用解析函数将返回的延迟器上的。我对这种延迟的东西不熟悉,不知道这是否是正确的解决方案 function getData(func) { var model = new Model(); var collection = new Collection(); var dfd = new jQuery.Deferred();

我有一个函数来获取一些数据,这个函数应该返回一个承诺。在函数中,我必须提出两个请求-一个接一个。我最后得到了一个嵌套的延迟器调用,其中最后一个调用
解析函数将返回的延迟器上的
。我对这种延迟的东西不熟悉,不知道这是否是正确的解决方案

function getData(func) {
    var model = new Model();
    var collection = new Collection();
    var dfd = new jQuery.Deferred();

    collection.fetch().then(function () {
        model.fetch().then(function () {
            dfd.resolve(collection);
        });
    });

    return dfd.then(function (collection) {
        return getViews(func(collection), model);
    });
}

如果通话顺序无关紧要,我建议使用


使用
你可以提出并行的xhr请求。

安德烈亚斯,我看你已经完全正确地接受了维塔利的回答,我并不是想窃取他的观点,只是为了以防万一,你不知道,没有必要创建和解决你自己的
$.Deferred()
,也没有必要传递
集合
(除了
func()
)因为它仍在范围内

就我从问题中的代码中可以看出,以下内容应该是有效的:

function getData(func) {
    var collection = new Collection();
    var model = new Model();
    return $.when(collection.fetch(), model.fetch()).then(function() {
        return getViews(func(collection), model);
    });
}

我可能在您的问题和接受的答案中发现了一个bug。这两个代码都在.then()回调中返回getView()。从概念上讲,理解getData()函数返回的是延迟的.then()而不是延迟的getView()。返回getView()在这里没有任何作用。如果您有其他代码使用此getData(),则,就像其他的.then()调用一样,您不能保证GetView是完整的。您只能保证它已经启动。看到问题了吗?只是需要注意一些事情。返回
$也是如此。when().done()
这里有一个解决方案?@cereal77killer,您关于“返回GetView()在这里什么都没有做”的断言是错误的(来自jQuery 1.8)不正确。包含内部的
返回
是为了使
getData()
返回的承诺按照您希望的方式运行。换句话说,如果您将
.then()
链接到
getData()
返回的承诺,您将保证
getViews()
已完成。如果您不相信我,请阅读以“从jQuery 1.8开始”开头的段落。使用
.done()
将给出您非常正确地试图避免的行为。您完全正确。我在几个项目中一直在1.7和2.0的代码库之间切换,并且必须假设它是在1.8之前。对不起!@cereal77killer,是的,非常遗憾jQuery实现了可怕的非标准
。然后()
从1.5到1.7。一定让数百万人感到困惑。