2010-10-06 4 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); 
} 

J'ai essayé de factoriser ce bloc en fonctionQue puis-je utiliser d'autre à la place de arguments.callee?

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

Mais cette fois-tableau donné se répète depuis le début

Je pense que le problème se produit dans arguments.callee, donc ce qui peut J'utilise au lieu de cela?
Meilleures salutations

+0

Comment vous attendez-vous à ce que la longueur de "todo" change? Que fait "callback"? – Pointy

+0

@ChaosPandion oups J'ai raté l'appel "shift". – Pointy

+0

@Pointy - Wow je me sens si boiteux pour taper le commentaire précédent, la suppression ... – ChaosPandion

Répondre

2

simplement donner un nom à votre fonction Anonymus afin que vous puissiez l'appeler par son nom.

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

Ce n'est pas une mauvaise alternative mais je pense qu'elle n'est pas supportée par toutes les implémentations * (Ne me citez pas ...) *. – ChaosPandion

+0

@ChaosPandion: ça marche, avec un effet secondaire dans IE: '" step "' serait introduit dans la portée locale. –

+0

Merci, encore une chose si l'étape de fonction a des arguments comment puis-je changer? – Myra

1

La fonction setInterval devrait répondre à vos besoins.

function runProcess(){ 
    var todo = items.concat(), 
     id = setInterval(function(){ 
        process(todo.shift()); 
        if(todo.length === 0) { 
         clearInterval(id); 
         callback(items); 
        } 
       }, 25); 
} 
Questions connexes