¿Por qué AppleScript en El Capitán se ejecuta de manera diferente?

1

¿Por qué en El Capitán esta aplicación dice 3 1 2? Antes de El Capitán decía 1 2 3.

Cuando se hace doble clic en este script, debe decir 1 2 3.

on run
  say "1"
  testing()
end run

on testing()
  say "2"
end testing

on idle
  say "3"
  return 60
end idle

on quit
end quit
    
pregunta scriptee2 01.11.2015 - 07:28

2 respuestas

3

El controlador on idle y quit son para Applets , no Scripts. Los applets y los scripts son diferentes, sin embargo, ambos están escritos en Applescript.

Un applet, es una aplicación de script, que admite los manejadores idle y quit , mientras que el script es como cualquier otro script en cualquier idioma; corre y hasta el final, no sabe cuándo está a punto de salir o cuando está inactivo. Aplíquelo como a cualquier otra aplicación, si hace clic con el botón derecho y "Abrir contenido del paquete" de un applet verá el parecido. El applet puede tener recursos, puede ser CodeSigned, tener múltiples scripts y compartirse sin ningún problema.

Ese es su problema, elija guardar el script como una aplicación cuando se le solicite, también seleccione "Mantener abierto después de ejecutar el controlador" , luego se ejecutará su controlador idle .

Pocas cosas más, siempre es una buena idea salir de cada controlador, que no está en run y testing , esto puede hacer que el controlador idle no se ejecute como lo estará esperando. para que run termine. También debe insertar continue quit en su controlador quit , de lo contrario nunca se cerrará; Tendrás que forzar la salida.

Para obtener más información Guía de lenguaje AppleScript

    
respondido por el user14492 01.11.2015 - 17:58
0

Primero: no puedo reproducir su problema en OS X El Capitan 10.11 (15A284). Su secuencia de comandos dice "1", "2", "3" cada vez que lo ejecuto.

Es posible que el orden exacto de los mensajes "ejecutar" y "inactivo" nunca se haya garantizado, por lo que es posible que ambas órdenes ({1, 2, 3} y {3, 1, 2}) se consideren correctas .

Sin embargo, si el orden de los mensajes de ejecución e inactividad es importante para su secuencia de comandos, puede usar una propiedad de secuencia de comandos para que el controlador de inactividad sepa cuándo ya se ejecutó el controlador de ejecución y no hacer nada hasta que lo haya hecho, por ejemplo,

property didRun : false

on run
    say "1"
    testing()
    set didRun to true
end run

on testing()
    say "2"
end testing

on idle
    if not didRun then
        say "has not run"
        return 1
    end if

    say "3"
    return 3
end idle

on quit
    set didRun to false

    say "quit"
    continue quit
end quit

Tenga en cuenta que es necesario restablecer didRun en el controlador quit porque los valores de propiedad normalmente persisten en las ejecuciones (al volver a escribirse en el archivo de secuencia de comandos).

    
respondido por el Chris Page 06.11.2015 - 22:08

Lea otras preguntas en las etiquetas