2013-11-03 31 views
0

jQuery的AJAX我有一些我需要他們的任務是在順序逐個執行:即成一個

function doTasks(tasks, urlDoTask) { 
    // Create a deferred for each task by calling doTask(). 
    var deferreds = $(tasks).map(function (i, task) { 
     return doTask(task, urlDoTask); 
    }).toArray(); 

    // return a composite deferred which will wait for each of the doTask requests. 
    return $.when.apply($, deferreds); 
} 

function doTask(task, urlDoTask) { 

    return ajax({ 
     url: getRootDir() + urlDoTask, 
     data: { param: task.SomeParam }, 
     type: 'POST', 
     dataType: 'json' 
    }).then(function (data) { 

     return ok(createObject("status", "ok", "op", "doTask", "task", task, "data", "passed")); 
    }, 
     function (data) { 

     return ok(createObject("status", "fail", "op", "doTask", "task", task, "data", "failed")); 
     }); 
} 

function ok() { 
    return newPromise("resolve", arguments); 
} 

function newPromise(type, args) { 
    return $.Deferred(function (dfd) { 
     dfd[type].apply(dfd, args); 
    }).promise(); 
} 

function createObject() { 
    var ob = {}; 

    // copy all the arguments name/value pairs into the object 
    for (var i = 0; i < arguments.length; i += 2) { 
     var n = arguments[i]; 
     var v = arguments[i + 1]; 

     ob[n] = v; 
    } 
    return ob; 
} 

如何修改這個代碼,以使每個doTask,以便一個被執行一個?我曾想過使用jQuery隊列,但如何在這裏應用?也許做類似這樣的事情:

var deferreds = $(tasks).map(function (i, task) { 
     $({}).queue(doTask(task, urlDoTask)); 
    }).toArray(); 

並且每個任務完成後,執行next()?

+0

@charlietfl我需要的數據,從每個任務加工成下一個任務,例如,如果我有TASK1,TASK2和TASK3我想是爲了執行它們,我的意思是,爲了發送jQuery的AJAX調用在這個例子中,首先發送task1,當task1完成時,發送task2,當task2完成時,發送task3。 – user304602

+0

行,所以你不想要數組延遲,那麼你正在使用'地圖'....你需要處理一個延遲一次...這基本上已經在那裏使用'.done()'在' $ .ajax' as other sugegst – charlietfl

回答

1

我更喜歡看起來更簡單的東西。只需從前一個成功處理程序開始下一個ajax調用即可。

function processTasks(tasks, urlDoTask) 

    var index = 0; 
    function nextTask() { 
     if (index < tasks.length) { 
      $.ajax({ 
       url: getRootDir() + urlDoTask, 
       data: { param: tasks[index].SomeParam }, 
       type: 'POST', 
       dataType: 'json', 
       success: function(result) { 
        // process ajax results here 

        // do next ajax call 
        ++index; 
        nextTask(); 
       } 
      }); 
     } 
    } 
    // start first ajax call 
    nextTask(); 
} 

通知你,我假設tasks是從你的每一個連續的Ajax調用得到.SomeParam項目的數組。如果情況並非如此,那麼請描述一下tasks是什麼。

+0

我剛剛更新了我的帖子。我正在嘗試使我的代碼適應你所說的內容,但我對如何適應我的上述代碼以便對其進行最小的修改並繼續工作有點困惑。請注意,我的代碼中的doTasks函數會等待所有任務(ping請求)完成才能繼續,並且doTask會在成功或失敗時返回一些數據,因此您可以指導我如何使其適應您的代碼?我在jquery/javascript編程中很新...感謝您的幫助。 – user304602

+0

@ user304602 - 在每個任務完成後,我不明白你想用'createObject()做什麼。這些物品在哪裏儲存?對不起,您目前的代碼需要非常先進的承諾理解才能理解。我試圖讓事情更容易理解。在每個任務的成功或失敗中添加邏輯來執行'createObject()'很容易,但我不明白你想要對它們做什麼。也許你可以用文字描述所需的數據結果是什麼。 – jfriend00

1

我對這類問題的處理方法是在完成時調用它自己的函數,只是顛倒一個參數來將遞歸轉換爲迭代。

比方說,你想按順序ping N urls(可能是一個不好的例子,但仍然有效)。

function pingURL(index) { 
    if(index>=urlArray.length) { 
     return 'Done'; 
    } else { 
     theURL=urlArray[index]; 
     jQuery.ajax({ 
        url:... 
        data: {urltoPing:theUrl} 
        }).done(function(response) { 
         otherFunctions(response); 
         index=index+1; 
         pingUrl(index); 
        }); 

    } 
} 

pingURL(0);