2010-10-06 3 views
1
function runProcess(){ 
    var todo = items.concat(); 
    setTimeout(function(){ 
     process(todo.shift()); 
     if(todo.length > 0){ 
      setTimeout(arguments.callee, 25); 
     } else { 
      callback(items); 
     } 
    }, 25); 
} 

Я попытался реорганизовать этот блок в функциюЧто еще я могу использовать вместо arguments.callee?

function doWork(todo){ 
     process(todo.shift()); 
     if(todo.length > 0){ 
      setTimeout(arguments.callee, 25); 
     } else { 
      callback(items); 
     } 
    } 

Но на этот раз данный массив повторяется с самого начала

Я думаю, что проблема возникает в arguments.callee, так что может я использую вместо него?
С наилучшими пожеланиями

+0

Как вы ожидаете изменения длины «todo»? Что делает «обратный вызов»? – Pointy

+0

@ChaosPandion oops Я пропустил вызов «shift». – Pointy

+0

@Pointy - Вау, я так хромаю для ввода предыдущего комментария, удаляя ... – ChaosPandion

ответ

2

Просто дать имя вашей функции Анонимус, так что вы можете назвать его по имени.

function runProcess(){ 
    var todo = items.concat(); 
    setTimeout(function step() { // give it a name 
     process(todo.shift()); 
     if(todo.length > 0){ 
      setTimeout(step, 25); // call it by its name 
     } else { 
      callback(items); 
     } 
    }, 25); 
} 
+0

Это неплохая альтернатива, но я думаю, что она не поддерживается всеми реализациями * (не цитируйте меня ...) *. – ChaosPandion

+0

@ChaosPandion: он работает с одним побочным эффектом в IE: '' step "' будет введен в локальную область. –

+0

Спасибо, еще одна вещь, если у параметра функции есть аргументы, как я могу измениться? – Myra

1

Функция setInterval должна отвечать вашим потребностям.

function runProcess(){ 
    var todo = items.concat(), 
     id = setInterval(function(){ 
        process(todo.shift()); 
        if(todo.length === 0) { 
         clearInterval(id); 
         callback(items); 
        } 
       }, 25); 
} 
Смежные вопросы