0

1つずつ順番に実行する必要があるタスクがいくつかあります。

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 を 1 つずつ順番に実行するにはどうすればよいですか? jquery キューを使用することを考えましたが、ここで適用するにはどうすればよいですか? たぶん次のようなことをしています:

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

各タスクが完了したら、next() を実行しますか?

4

2 に答える 2

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();
}

参考までに、これは、連続する ajax 呼び出しごとtasksに取得するアイテムの配列であると想定しています。.SomeParamそうでない場合は、その内容を説明してくださいtasks

于 2013-11-03T20:28:58.210 に答える
1

この種の問題に対する私のアプローチは、完了時に関数自体を呼び出し、1 つのパラメーターをぶつけて再帰を反復に変えることです。

N 個の URL を順番に ping したいとしましょう (おそらく悪い例ですが、それでも有効です)。

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);
于 2013-11-03T20:29:13.387 に答える