2010-02-04 12 views
6

Cuando trato de ejecutar el siguiente código en mi programano SetTimeOut trabajando en escritura ventanas (JScript)

setTimeout("alert('moo')", 1000); 

me sale el siguiente error

Error: Object expected 
Code: 800A138F 
Source: Microsoft JScript runtime error 

¿Por qué? ¿Estoy llamando a la función incorrecta? Lo que quiero hacer es retrasar la ejecución de la función siguiente.

+0

tendremos que ver más código que este. –

Respuesta

7

Parece que está usando setTimeout en un script no basado en navegador (Windows Script Host o similar). No puedes hacer eso. Sin embargo, puede usar WScript.Sleep para suspender su secuencia de comandos brevemente, con lo cual puede lograr un efecto similar. Además, alert no es una función de WSH; es posible que desee WScript.Echo. Más sobre el WSH reference on MSDN.

+0

lol no es esto otra vez ;-) Acabo de editar el método 'Sleep' en mi respuesta junto con el enlace de MSDN. –

+0

¡Y el vagabundo aceptó tu respuesta, no la mía! el nervio ;-) –

+0

@Andy: ¡LOL! Payback! (Ahora, ¿dónde está Pekka?) –

6

setTimeout es un método del objeto window provisto por los navegadores web. No está disponible para los scripts que se ejecutan en Windows Script Host. Esos scripts tienen un único hilo de ejecución de principio a fin y no tienen temporizadores de retardo.

Si desea pausar la ejecución del script, puede usar el método Sleep del objeto WScript.

3

Necesitaba WSH para comportarse como un código similar en el navegador que utiliza setTimeout, así que esto es lo que se me ocurrió.

Simplemente haga que su hilo único ejecute todo en una cola. Puede seguir agregando a la cola. El programa solo terminará cuando no queden funciones en la cola.

No es compatible con cadenas para funciones eval, solo.

function main() { 
    Test.before(); 
    _setTimeout(Test.timeout1, 1000); 
    _setTimeout(Test.timeout2, 2000); 
    _setTimeout(Test.timeout3, 500); 
    _setTimeout(Test.error, 2001); 
    Test.after(); 
} 

var Test = function() { 
    var ld = "---- "; 
    var rd = " ----"; 
    return { 
    before : function() { 
     log(ld + "Before" + rd); 
    }, 
    after : function() { 
     log(ld + "After" + rd); 
    }, 
    timeout1 : function() { 
     log(ld + "Timeout1" + rd); 
    }, 
    timeout2 : function() { 
     log(ld + "Timeout2" + rd); 
    }, 
    timeout3 : function() { 
     log(ld + "Timeout3" + rd); 
    }, 
    error : function() { 
     log(ld + "error" + rd); 
     errorFunc(); 
    } 
    }; 
}(); 

var FuncQueue = function() { 
    var funcQueue = []; 
    function FuncItem(name, func, waitTil) { 
    this.name = name; 
    this.func = func; 
    this.waitTil = waitTil; 
    } 
    return { 
    add : function(func, name, waitTil) { 
     funcQueue.push(new FuncItem(name, func, waitTil)); 
    }, 
    run : function() { 
     while (funcQueue.length > 0) { 
     var now = new Date().valueOf(); 
     for (var i = 0; i < funcQueue.length; i++) { 
      var item = funcQueue[i]; 
      if (item.waitTil > now) { 
      continue; 
      } else { 
      funcQueue.splice(i, 1); 
      } 
      log("Executing: " + item.name); 
      try { 
      item.func(); 
      } catch (e) { 
      log("Unexpected error occured"); 
      } 
      log("Completed executing: " + item.name); 
      break; 
     } 
     if (funcQueue.length > 0 && i > 0) { 
      if (typeof (WScript) != "undefined") { 
      WScript.Sleep(50); 
      } 
     } 
     } 
     log("Exhausted function queue"); 
    } 
    } 
}(); 

function _setTimeout(func, delayMs) { 
    var retval = undefined; 
    if (typeof (setTimeout) != "undefined") { 
    retval = setTimeout(func, delayMs); // use the real thing if available 
    } else { 
    FuncQueue.add(func, "setTimeout", new Date().valueOf() + delayMs); 
    } 
    return retval; 
} 

var log = function() { 
    function ms() { 
    if (!ms.start) { 
     ms.start = new Date().valueOf(); 
    } 
    return new Date().valueOf() - ms.start; // report ms since first call to function 
    } 
    function pad(s, n) { 
    s += ""; 
    var filler = "  "; 
    if (s.length < n) { 
     return filler.substr(0, n - s.length) + s; 
    } 
    return s; 
    } 
    return function(s) { 
    if (typeof (WScript) != "undefined") { 
     WScript.StdOut.WriteLine(pad(ms(), 6) + " " + s); 
    } else { 
     // find a different method 
    } 
    } 
}(); 

FuncQueue.add(main, "main"); 
FuncQueue.run(); 
0

Para cualquiera que esté buscando la función de alerta para trabajar en un guión autónomo (entorno Windows Script Host), te recomiendo que compruebes jPaq's función de alerta que se documenta here y descargable here. Definitivamente he encontrado que esta nueva biblioteca es útil para mis scripts independientes.

Cuestiones relacionadas