javascript中的函数同步

function Synchronization in javascript

本文关键字:同步 函数 javascript      更新时间:2023-09-26

我在不同的js代码部分中有5个不同的ajax请求,只有一个处理程序:

ajaxRequest1
ajaxRequest2
ajaxRequest3
ajaxRequest4
ajaxRequest5
handler

我想实现以下订单:

如果我调用ajaxRequest1,我应该处理它,只有在它之后我才能发出下一个ajaxRequest。

例如,它是良好的订购:

start ajaxRequest1
start handler
start ajaxRequest2
start handler
start ajaxRequest3
start handler
start ajaxRequest4
start handler
start ajaxRequest5
start handler

但它很糟糕:

start ajaxRequest1
start ajaxRequest2
start ajaxRequest3
start handler
start handler
start ajaxRequest4
start handler
start handler     
start ajaxRequest5
start handler

javascript允许实现它吗?

如果我理解正确,那么在运行某个程序之前,您需要等待某个条件变为true。如果是这样,这可以通过setTimeout循环来实现。

   function waitFor(fnReady, fnCallback) {
    var check = function() {
        if (fnReady()) {
            fnCallback();
        }
        else {
            setTimeout(check, 100);  // wait another 100ms, and try again
        }
    };
    check();
}

var result = 0;
function ajaxRequest1() {
    $.ajax(...).done(
         function() { result++; }
    );
}
function ajaxRequest2() {
    $.ajax(...).done(
         function() { result++; }
    );
}
waitFor(function() { return result === 1; }, ajaxRequest2);
waitFor(function() { return result === 2; }, ajaxRequest3);

听起来像是Deferred的工作。如果你使用的是jQuery,像这样的东西应该可以做你想要的:

function ajaxRequest1() {
    var dfd = $.Deferred();
    $.ajax(...)
        .done(function(response) {
            if (/*response is valid*/)
                dfd.resolve(response);
            else
                dfd.reject();
        });
        .fail(function() {
            dfd.reject();
        });
    return dfd.promise();
}
function ajaxRequest2(response1) {
    // similar to ajaxRequest1, but with different URL, params
}
function ajaxRequest3(response2) {
   // similar to ajaxRequest2, but with different URL, params
}
// Run the tasks sequentially
$.when(ajaxRequest1())
    .then(ajaxRequest2)
    .then(ajaxRequest3)
    .done(function(result1, result2, result3) {
        // all requests have completed
    })
    .fail(function() {
        // handle error
    });

这里,每个ajaxRequestX函数也是处理程序。它检查从上一个请求接收到的响应,如果一切正常,则启动下一个请求。查看jQuery的Deferred对象以了解更多信息。