使用$ .ajax调用的自定义插件会断开链接

时间:2012-06-12 20:06:07

标签: jquery jquery-plugins jquery-chaining

我创建了一个jQuery插件,用于在页面上创建html,其中包含从webservice调用中读取的xml。作为备份,如果webservice调用失败,则存储在var中的默认xml用于构建html。现在,我无法使用Web服务,因此我无法使用虚拟xml测试故障情况。我写了所有内容并使用$ .ajax调用排除,当我在我的代码中包含$ .ajax调用webservice时,它仍然正常工作,但链接已被破坏。

我知道“返回这个;”,我已经实现了$ .when()。then()包装我的$ .ajax调用来处理ajax调用的异步性质可能引入的任何问题,但是链接仍然不起作用。 firebug控制台总是告诉我,当我到达链中的下一个方法时,我的方法返回是未定义的,这让我相信我实际上根本不会返回“this”,即使它看起来像我一样。我的代码如下(用伪代码替换了很多以节省时间):

(function( $ ) {

$.fn.createHtmlFromWS = function( options ) {

    var $this = $(this);

    //function to output the parsed xml as HTML appended to the jQuery object the plugin was called on
    function buildNav(dispXml){

        //logic to append xml to $this as custom html goes here

        return $this;
    }

    //fallback xml if webservice call fails
    var failXml = '<?xml version="1.0" encoding="utf-8"?><hello><world>earth</world></hello>';

    //dummy service url to force webservice fail scenario
    var serviceUrl = 'http://1234lkjasdf/test';

    //Note: this call that does not attempt $.ajax call to webservice WORKS with chaining
    //return buildNav($.parseXML(failXml));

    //call to webservice
    $.when($.ajax({
        type: 'GET',
        dataType: 'xml',
        url: serviceUrl,
        timeout: 10,
    })).then(function(a1) { //function to call if succeeded
        return buildNav($.parseXML(a1[2].responseXml));
    }, function(){ //function to call if failed
        console.log("in the error part of then"); //Note: this is output to log, I know i'm in the right spot

        //This line does not seem to be returning $then which is required for chaining, although it is building the html as expected
        return buildNav($.parseXML(failXml)); 
    }); 
};
}) ( jQuery );

1 个答案:

答案 0 :(得分:1)

这是因为您从回调函数返回,而不是函数本身。当您的AJAX请求完成时,您的原始函数早已返回undefined

在你的AJAX调用之后,就在函数结束之前,你可能想要return $this;