Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/74.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
Jquery 链接延迟_Jquery_Jquery Deferred_Deferred - Fatal编程技术网

Jquery 链接延迟

Jquery 链接延迟,jquery,jquery-deferred,deferred,Jquery,Jquery Deferred,Deferred,我有很多功能,目前看起来像这样: function LoadFromURL(url) { var d = $.Deferred(); $.get(url).then(function(text) { LoadFromText(text).then(function(obj) { d.resolve(obj); }, function(err) {

我有很多功能,目前看起来像这样:

function LoadFromURL(url) 
{
    var d = $.Deferred();
    $.get(url).then(function(text)
    {
        LoadFromText(text).then(function(obj)
        {
            d.resolve(obj);
        }, 
        function(err)
        {
            d.reject(err);
        });
    }, 
    function(err)
    {
        d.reject(err);
    });
    return d.promise();
}
function LoadFromURL(url) 
{
    return $.get(url).then(function(text)
    {
        return LoadFromText(text);
    }, 
    function(err)
    {
        return $.Deferred().reject(err);
    }).promise();
}
此函数获取URL并加载承诺中的文本。然后将文本传递给LoadFromText函数,该函数返回另一个承诺。如果此操作成功,将解决外部延迟问题。如果无法加载URL,或者LoadFromText函数失败,则拒绝外部延迟

是否有一种方法可以将解决/拒绝的结果链接起来,并以如下方式结束:

function LoadFromURL(url) 
{
    var d = $.Deferred();
    $.get(url).then(function(text)
    {
        LoadFromText(text).then(function(obj)
        {
            d.resolve(obj);
        }, 
        function(err)
        {
            d.reject(err);
        });
    }, 
    function(err)
    {
        d.reject(err);
    });
    return d.promise();
}
function LoadFromURL(url) 
{
    return $.get(url).then(function(text)
    {
        return LoadFromText(text);
    }, 
    function(err)
    {
        return $.Deferred().reject(err);
    }).promise();
}
我见过一些允诺的实现允许这样做——在“then”内返回允诺意味着使用允诺的最终结果

我意识到这在目前还不起作用(结果是承诺,而不是承诺的结果),但希望有人能提出一种方法来实现这一点,这样我就可以收拾第一个例子中有时令人困惑的混乱局面


我希望这是有道理的。谢谢。

LoadFromURL
将简化如下:

function LoadFromURL(url) {
    return $.get(url).then(function(text) {
        return LoadFromText(text);
    });
}
可能有一些问题您没有考虑

与原始版本一样,该过程将趋向于无限期地递归,直到服务器返回HTTP错误。在适当地编写服务器资源时,您可能会遇到一些挑战,特别是如果您需要访问最终交付的文本,那么更是如此

再仔细考虑一下,您就可以以这样一种方式交付所有文本,即在文本本身或HTTP响应代码中指示“continue”或“complete”。例如,您可以使用响应代码202(“已接受”)来指示流程不完整

我认为这会起作用(使用jQuery 1.5+):

您只需要安排服务器返回202表示“继续”,或返回200表示“完成”

因此,可以按如下方式调用LoadFromURL():

LoadFromURL('my/resource').then(function(text) {
    console.log("After a series of $.get requests, the finally delivered text was:\n" + text);
});

LoadFromURL
将简化如下:

function LoadFromURL(url) {
    return $.get(url).then(function(text) {
        return LoadFromText(text);
    });
}
可能有一些问题您没有考虑

与原始版本一样,该过程将趋向于无限期地递归,直到服务器返回HTTP错误。在适当地编写服务器资源时,您可能会遇到一些挑战,特别是如果您需要访问最终交付的文本,那么更是如此

再仔细考虑一下,您就可以以这样一种方式交付所有文本,即在文本本身或HTTP响应代码中指示“continue”或“complete”。例如,您可以使用响应代码202(“已接受”)来指示流程不完整

我认为这会起作用(使用jQuery 1.5+):

您只需要安排服务器返回202表示“继续”,或返回200表示“完成”

因此,可以按如下方式调用LoadFromURL():

LoadFromURL('my/resource').then(function(text) {
    console.log("After a series of $.get requests, the finally delivered text was:\n" + text);
});

我不确定我是否理解正确,因为你的第二个函数
LoadFromText
对我来说有点像黑匣子。但是,我认为,你的结构对于执行的事情来说过于臃肿。试着用更多的函数来做,而不是用更少的函数。我做了一个提议:

function Load() {
    var myUrl = '//path.to/url';
    LoadFromUrl(myUrl)
        .then(LoadFromText, errorHandler)
        .then(successHandler, errorHandler);
}

function successHandler(returnedData) {
    console.log('Requests were successful: ' + returnedData);
}

function errorHandler(err) {
    console.log('An error occurded: ' + err);
}

function LoadFromURL(url) {
    return $.get(url);
}

function LoadFromText(text) {
    // THIS IS SOME SORT OF BLACK BOX FOR ME...
    // SEEMS TO RETURN A PROMISE, THOUGH

    var $deferred = $.Deferred();

    // DO THE LOGIC TO EITHER REJECT OR RESOLVE THE PROMISE

    return $deferred.promise();
}
您只能使用主函数
Load
来启动ajax链。第一个ajax请求完成后,第二个ajax请求将从第一个ajax请求的数据开始。之后,successHandler将对第二个ajax调用的数据执行任何需要的操作。这是对您的解决方案的重要补充。

除此之外,它基本上与您所做的相同,但分布到更小的函数中,更易于维护。

我不确定是否正确理解您的意思,因为您的第二个函数
LoadFromText
对我来说是一个黑匣子。但是,我认为,你的结构对于执行的事情来说过于臃肿。试着用更多的函数来做,而不是用更少的函数。我做了一个提议:

function Load() {
    var myUrl = '//path.to/url';
    LoadFromUrl(myUrl)
        .then(LoadFromText, errorHandler)
        .then(successHandler, errorHandler);
}

function successHandler(returnedData) {
    console.log('Requests were successful: ' + returnedData);
}

function errorHandler(err) {
    console.log('An error occurded: ' + err);
}

function LoadFromURL(url) {
    return $.get(url);
}

function LoadFromText(text) {
    // THIS IS SOME SORT OF BLACK BOX FOR ME...
    // SEEMS TO RETURN A PROMISE, THOUGH

    var $deferred = $.Deferred();

    // DO THE LOGIC TO EITHER REJECT OR RESOLVE THE PROMISE

    return $deferred.promise();
}
您只能使用主函数
Load
来启动ajax链。第一个ajax请求完成后,第二个ajax请求将从第一个ajax请求的数据开始。之后,successHandler将对第二个ajax调用的数据执行任何需要的操作。这是对您的解决方案的重要补充。
除此之外,它基本上与您所做的相同,但分布到更小的功能,更易于维护

有没有一种方法可以将结果链接起来

是的,这是的默认行为

我见过一些允诺的实现允许这样做——在“then”内返回允诺意味着使用允诺的最终结果

jQuery从1.8版开始就支持这种行为。对于1.5到1.7,您可以使用

有没有一种方法可以将结果链接起来

是的,这是的默认行为

我见过一些允诺的实现允许这样做——在“then”内返回允诺意味着使用允诺的最终结果


jQuery从1.8版开始就支持这种行为。对于1.5到1.7,您可以使用。

jQuery的Deferred's
then
方法与我使用过的其他promise库稍有不同。它更倾向于用作过滤器。(当然,你可以用它做任何你想做的事。)取而代之的是看
.when()
。如果这不符合您的要求,那么您的第一个代码块看起来就像我处理这个问题的方式。或者,包括Async.js或其他东西。jQuery的Deferred的
then
方法与我使用过的其他promise库稍有不同。它更倾向于用作过滤器。(当然,你可以用它做任何你想做的事。)取而代之的是看
.when()
。如果这不符合您的要求,那么您的第一个代码块看起来就像我处理这个问题的方式。或者,包括Async.js之类的东西。我一定是弄错了我的第一个例子,因为它看起来确实像我期望的那样工作。谢谢。我一定是弄错了我的第一个例子,因为它看起来确实像我期望的那样起作用。谢谢