我有一些代码完成链中的一组不同的操作。操作集本身在循环中执行。由于我正在处理的系统的性质,操作集需要同步执行(即,在第一组操作完成之前,下一组操作不能执行)。异步执行可能会脱离远程处理器(不在我的控制范围内),并导致代码失败。现在,我唯一能让它工作的方法就是使用警告框,这真的很蹩脚,也不是一个选择。我试过:
- 使用美元。并将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);
});
必须从函数中返回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);
我认为你必须停止使用.each()
,因为它会立即运行整个迭代,你不希望这样做。
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();
}
或者,使用deferred:
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();
}
关于延迟的注意事项:必须传递函数引用,而不是函数调用。这意味着传递函数名时不带父元素。