如何在Javascript中取消链接匿名函数?

时间:2011-10-13 02:58:20

标签: javascript

有没有办法取消(或取消链接)下面的链式匿名函数?我在脚本之后使用嵌套的匿名函数包含我的尝试。我想单独定义每个匿名定义的函数,以便清楚地看到每个函数的开始和结束位置以及它们的作用。谢谢。

我想要分隔的嵌套匿名函数的脚本(taken from here):

<html>
<script>
chrome.browserAction.onClicked.addListener(function(tab) {
chrome.tabs.getSelected(null, function(tab) {

  chrome.tabs.sendRequest(tab.id, {action: "getDOM"}, function(response) {
    var firstParagraph = response.dom;
  //}); moved to end to get the variable firstParagraph

var formData = new FormData();
formData.append("url", tab.url);
formData.append("title", tab.title);
formData.append("pitch", firstParagraph);
//formData.append("user_tag_list", "tag1, tag2");


var xhr = new XMLHttpRequest();
xhr.open("POST", "http://ting-1.appspot.com/submithandlertest", true);
xhr.onreadystatechange = function (aEvt) {
    if (xhr.readyState == 4) {
        if (xhr.status == 200){ 
            console.log("request 200-OK");
            chrome.browserAction.setBadgeText ( { text: "done" } );
            setTimeout(function () {
            chrome.browserAction.setBadgeText( { text: "" } );
            }, 2000);
        }else{
            console.log("connection error");
            chrome.browserAction.setBadgeText ( { text: "ERR" } );
     }        
  }        
};
xhr.send(formData);


}); //chrome.tabs.sendRequest
        });
    });
</script>
</html>

我尝试取消匿名函数并重新构建脚本:

functionForSendRequest = function (response) {var firstParagraph = response.dom;
            var formData = new FormData();
                formData.append("url", tab.url);
                formData.append("title", tab.title);
                formData.append("pitch", firstParagraph);
            var xhr = new XMLHttpRequest();
                xhr.open("POST", "http://ting-1.appspot.com/submithandlertest", true);
                xhr.onreadystatechange = function (aEvt) {
                if (xhr.readyState == 4){
                    if (xhr.status == 200){ 
                        console.log("request 200-OK");
                        chrome.browserAction.setBadgeText({text: "done" });
                        setTimeout(function(){
                        chrome.browserAction.setBadgeText({text: ""});}, 2000);}
                    else{console.log("connection error");
                        chrome.browserAction.setBadgeText({text: "ERR"});}}};
                xhr.send(formData);}}

argumentToGetSelected = chrome.tabs.sendRequest(tab.id, {action: "getDOM"}, functionForSendRequest()}

...

functionForGetSelected = function (tab) {chrome.tabs.sendRequest(tab.id, {action: "getDOM"}, *function for getSelected goes here*)}

1 个答案:

答案 0 :(得分:3)

要清楚地看到逻辑,而不是“解开”它们,为什么不尝试练习良好的缩进。然后,您可以根据其缩进级别直观地跟踪每个方法。像这样:

chrome.browserAction.onClicked.addListener(function(tab) {
    chrome.tabs.getSelected(null, function(tab) {
        chrome.tabs.sendRequest(tab.id, {action: "getDOM"}, function(response) {
            var firstParagraph = response.dom;

            var formData = new FormData();
            formData.append("url", tab.url);
            formData.append("title", tab.title);
            formData.append("pitch", firstParagraph);
            //formData.append("user_tag_list", "tag1, tag2");

            var xhr = new XMLHttpRequest();
            xhr.open("POST", "http://ting-1.appspot.com/submithandlertest", true);
            xhr.onreadystatechange = function (aEvt) {
                if (xhr.readyState == 4) {
                    if (xhr.status == 200){ 
                        console.log("request 200-OK");
                        chrome.browserAction.setBadgeText ( { text: "done" } );
                        setTimeout(function () {
                            chrome.browserAction.setBadgeText( { text: "" } );
                        }, 2000);
                    } else {
                        console.log("connection error");
                        chrome.browserAction.setBadgeText ( { text: "ERR" } );
                    }        
                }        
            };
            xhr.send(formData);
        }); //chrome.tabs.sendRequest
    }); // chrome.tabs.getSelected
}); // chrome.browserAction.onClicked.addListener

或者,如果你想“取消链接”,唯一真正明显的事情是分别定义内部回调,如下所示:

var handle_request = function(response) {
    var firstParagraph = response.dom;

    var formData = new FormData();
    formData.append("url", tab.url);
    formData.append("title", tab.title);
    formData.append("pitch", firstParagraph);
    //formData.append("user_tag_list", "tag1, tag2");

    var xhr = new XMLHttpRequest();
    xhr.open("POST", "http://ting-1.appspot.com/submithandlertest", true);
    xhr.onreadystatechange = function (aEvt) {
        if (xhr.readyState == 4) {
            if (xhr.status == 200){ 
                console.log("request 200-OK");
                chrome.browserAction.setBadgeText ( { text: "done" } );
                setTimeout(function () {
                    chrome.browserAction.setBadgeText( { text: "" } );
                }, 2000);
            } else {
                console.log("connection error");
                chrome.browserAction.setBadgeText ( { text: "ERR" } );
            }        
        }        
    };
    xhr.send(formData);
}

chrome.browserAction.onClicked.addListener(function(tab) {
    chrome.tabs.getSelected(null, function(tab) {
        chrome.tabs.sendRequest(tab.id, {action: "getDOM"}, handle_requeest);
    });
});