如何顺序循环/发布/发布呼叫(等待上一个返回)



我正在为网页编写一个tampermonkey脚本,并尝试从其他页面提取数据。
我正在尝试制作一个在列表, llcList中具有循环的函数,并从ajax方法中检索数据,但想等待在转到第二个请求之前完成一个请求。

奖励是如果我可以让它等待额外的时间。

应该发生什么:

  1. 发送LLCLIST的请求[0]
  2. 获取返回数据,处理IT
  3. 等待一些时间
  4. 向LLCLIST发送新请求[1]

这可能吗?我尝试了几种方法,每次循环都会发送所有请求,而不是相隔一秒钟。:

function F_Company_LLC(){
for (i = 0; i < llcList.length;i++) {
        if(llcList[i][2]=="lab"){
            //run function 0
            //break;
        }
        else if(llcList[i][2]=="shop"){
            //run function 1
            //break;
        }
        else{
            F_GET_CompData(llcList, llcList[i][1],i,function(result){
                console.log(result);
            });
        }
}}
function F_GET_CompData(F_GET_CompData_list, CompID, F_GET_CompData_row, callback){
$.ajax({
    method : "GET",
    url: base_link+"/company/edit_company/"+CompID,
    beforeSend: function(){runningRequest++;},
    success: function(data){
  //data processing
        runningRequest--;
    },
    error: function() {console.log("Get_ComData");}
});
callback(runningRequest);}

这是一个常见的情况。请注意,通常不需要依次处理呼叫。通常,只需用ajax呼叫发送上下文,然后将所有内容随机分配在一起,如所示。


强制顺序行为的一种方法是通过complete函数进行链条调用。这是全功能代码,演示了过程。要使用,请在堆栈溢出页面上将其粘贴到浏览器控制台中。:

var listO_pages = ["q/48/", "q/27/", "q/34/", "q/69/", "badpage"];
var numPages    = listO_pages.length;
getPageN (0);  //-- Kick off chained fetches
function getPageN (K) {
    if (K >= 0  &&  K < numPages) {
        let targPage = listO_pages[K];
        $.ajax ( {
            url:            "https://stackoverflow.com/" + targPage,
            context:        {arryIdx: K},  //  Object Helps handle K==0, and other things
            success:        processPage,
            complete:       finishUpRequest,
            error:          logError
        } );
    }
}
function processPage (sData, sStatus, jqXHR) {
    //-- Use DOMParser so that images and scripts don't get loaded (like jQuery methods would).
    var parser          = new DOMParser ();
    var doc             = parser.parseFromString (sData, "text/html");
    var payloadTable    = doc.querySelector ("title");
    var pageTitle       = "Not found!";
    if (payloadTable) {
        pageTitle       = payloadTable.textContent.trim ();
    }
    var [tIdx, tPage]   = getIdxAndPage (this);  // Set by `context` property
    console.log (`Processed index ${tIdx} (${tPage}). Its title was: "${pageTitle}"`);
}
function finishUpRequest (jqXHR, txtStatus) {
    var nextIdx     = this.arryIdx + 1;
    if (nextIdx < numPages) {
        var tPage   = listO_pages[nextIdx];
        //-- The setTimeout is seldom needed, but added here per OP's request.
        setTimeout ( function () {
            console.log (`Fetching index ${nextIdx} (${tPage})...`);
            getPageN (nextIdx);
        }, 222);
    }
}
function logError (jqXHR, txtStatus, txtError) {
    var [tIdx, tPage]   = getIdxAndPage (this);  // Set by `context` property
    console.error (`Oopsie at index ${tIdx} (${tPage})!`, txtStatus, txtError, jqXHR);
}
function getIdxAndPage (contextThis) {
    return [contextThis.arryIdx, listO_pages[contextThis.arryIdx] ];
}


这通常输出:

处理索引0(Q/48/)。它的标题是:"以HTML形式的多个提交按钮 - 堆栈溢出"提取索引1(q/27/)...处理的索引1(Q/27/)。它的标题是:" DateTime-计算C# - 堆栈溢出中的相对时间"提取索引2(Q/34/)...处理的索引2(Q/34/)。它的标题是:" Flex-在ActionScript 3中卸载bytearray -stack Overflow"提取索引3(Q/69/)...处理的索引3(Q/69/)。它的标题是:" .NET-我如何计算某人在C#中的年龄? - 堆栈溢出"提取索引4(badpage)...获取https://stackoverflow.com/badpage?_=1512087299126 404()oopsie在索引4(badpage)!错误对象{...

- 取决于您的堆栈溢出声誉。


重要:不要尝试使用async: false技术。这些只是:锁定浏览器,偶尔会崩溃您的计算机,使调试和部分结果更加困难。

最新更新