1

一連の一連の操作を一連のチェーンで完了するコードがあります。一連の操作自体がループで実行されます。私が扱っているシステムの性質上、操作セットは同期的に実行する必要があります (つまり、次の操作セットは最初のセットが完了するまで実行できません)。非同期実行は、(私の制御下にない) リモート プロセッサを停止させ、コードが失敗する原因となる可能性があります。現在、これを機能させることができた唯一の方法は、アラートボックスを使用することです。これは本当に不十分であり、オプションではありません. 私はもう試した:

  • $.ajax を使用し、async を false に設定する
  • スリープ機能を使う
  • アラート ボックス (必死で使用)

ここにコードがあります - 何か考えはありますか?:

$('input:checked').each(function(index){                        

    //get the item's location id
    var currentInput = $(this).val();

    var copyUser = function(){$.get(urlCopyPrefix + currentInput + urlSuffix);}
    var moveUser = function(){$.get(urlMovePrefix + moveLocation + urlSuffix);}

    var cleanup = function(){

        var newSibling = $('#module-' + moveLocation);
        newSibling.before('<li>New Line</li>');

        alert('done');
    }

    /* --> THIS IS THE CODE IN QUESTION <-- */
    $.when(copyUser()).pipe(moveUser).then(cleanup);

});
4

2 に答える 2

1

.each()すぐに反復全体を実行し、それをしたくないので、使用を停止する必要があると思います。

補完関数とローカル関数を使用して、これを行う 1 つの方法を次に示します。

function copyMove(moveLocation, urlCopyPrefix, urlMovePrefix, urlSuffix)
    var checked = $('input:checked');
    var index = 0;

    function next() {
        if (index < checked.length) {
            var currentInput = checked.eq(index++).val();
            $.get(urlCopyPrefix + currentInput + urlSuffix, function() {
                $.get(urlMovePrefix + moveLocation + urlSuffix, function() {
                    $('#module-' + moveLocation).before('<li>New Line</li>');
                    next();
                });
            });
         }
    }

    next();
}

または、遅延オブジェクトを使用して:

function copyMove(moveLocation, urlCopyPrefix, urlMovePrefix, urlSuffix)
    var checked = $('input:checked');
    var index = 0;

    function copyUser () { 
        var currentInput = checked.eq(index).val();
        return $.get(urlCopyPrefix + currentInput + urlSuffix);
    }
    function moveUser() {
        return $.get(urlMovePrefix + moveLocation + urlSuffix);
    }
    function cleanup() {
        ++index;
        $('#module-' + moveLocation).before('<li>New Line</li>');
        next();
    }

    function next() {
        if (index < checked.length) {
            $.when(copyUser()).pipe(moveUser).then(cleanup);
         }
    }

    next();
}

遅延オブジェクトに関する注意: 関数呼び出しではなく、関数参照を渡す必要があります。つまり、括弧なしで関数名を渡します。

于 2011-12-26T22:15:52.433 に答える
1

関数から jqXHR オブジェクトを返す必要があります。

var copyUser = function(){
        return $.get(urlCopyPrefix + currentInput + urlSuffix);
    },
    moveUser = function(){
        return $.get(urlMovePrefix + moveLocation + urlSuffix);
    };

次に、次のことができます。

$.when( copyUser() ).pipe( moveUser ).then( cleanup );

ループ内の各項目が完了するのを待ってから次の項目を開始する場合は、次のようにします。

var $items = $('input:checked'),
    length = $items.length,
    copyUser = function(currentInput)
    {
        return $.get(urlCopyPrefix + currentInput + urlSuffix);
    },
    moveUser = function()
    {
        return $.get(urlMovePrefix + moveLocation + urlSuffix);
    },
    cleanup = function()
    {
        $('#module-' + moveLocation).before('<li>New Line</li>');
    };

function processUser(i)
{
    $.when( copyUser($items.eq(i).val()) ).pipe( moveUser ).then(function()
    {
        cleanup();
        i < length && processUser(++i);
    });
}

processUser(0);
于 2011-12-26T22:16:09.890 に答える