2016-06-15 1 views
1

J'ai essayé d'utiliser un window.setTimeout mais je reçois une erreur lors de l'exécution:setTimout avec JavaScript pour l'automatisation

Error on line 182: TypeError: window.setTimeout is not a function. (In

window.setTimeout(function(){ 

}, 3000); 

, window.setTimeout is undefined) (-2700)

quelqu'un peut me aider?

+2

pouvez-vous s'il vous plaît envoyer votre code? –

+1

Message d'erreur assez descriptif. Donc, vous n'avez pas setTimeOut dans JXA - peut-être que delay() fonctionnera – mplungjan

+0

Ou supprimez la fenêtre. de lui puisqu'il n'y a pas de fenêtre – mplungjan

Répondre

0

Selon votre erreur, l'appel est erronée (il semble une fonction vide) vérifier:

setTimeout(function(){ alert("This will show after 3 seconds"); }, 3000);

+0

même je reçois le même message d'erreur: Erreur sur la ligne 1: ReferenceError: Impossible de trouver la variable: setTimeout – Mermoz

0

Les deux fonctionnent très bien.

setTimeout(function(){ alert("working"); }, 1000);

window.setTimeout(function() {alert("working");},1000);

+0

J'ai essayé de l'exécuter dans Apple Script Editor et j'obtiens la même erreur: Erreur sur la ligne 1: ReferenceError: Impossible de trouver la variable: setTimeout – Mermoz

3

Il n'y a rien asynchrone JXA. Vous pouvez utiliser delay (3), mais rien d'autre ne s'exécute.

Vous pouvez déclencher une autre tâche avec $ .system ("yourCommand &"), il s'exécute de manière asynchrone. Voici une petite démo qui parle de manière asynchrone. Il pourrait être un autre script qui fait tout ce dont vous avez besoin

ObjC.import('stdlib') 
var app = Application.currentApplication() 
app.includeStandardAdditions = true 
$.system("(sleep 2;say hurry up!)&") // see the difference when you remove the &! 
prompt("are you ready?","yes") 
function prompt(text, defaultAnswer) { 
    var options = { defaultAnswer: defaultAnswer || '' } 
    try { 
    return app.displayDialog(text, options).textReturned 
    } catch (e) { 
    return null 
    } 
} 
+0

Ok merci pour votre réponse. Mais l'appel retardé déclenche un appel système et je voulais actualiser l'interface utilisateur de mon application avec un délai (ou le JS setInterval). Bon à présent qu'il n'y a rien d'asynchrone dans JXA. – Mermoz

+0

Je suppose que votre seule alternative est le retard de blocage (2). En tant que gars asynchrone, je l'ai trouvé désagréable. –

2

D'abord, JXA n'a pas window que l'objet global car il est pas un navigateur. Vous pouvez accéder à l'objet global via le niveau supérieur this ou, plus simplement, omettre l'objet global pour accéder directement aux variables et fonctions globales.

this.Math.sin(1) 
// or 
Math.sin(1) 

En second lieu, JXA n'a pas de support pour setTimeout actuellement. C'est la raison essentielle pour laquelle vous avez l'erreur que setTimeout est indéfini. Toutefois, vous pouvez émuler setTimeout avec its Objective-C bridge. Ceci est un exemple d'implémentation de setTimeout avec NSTimer. Notez que travailler avec NSTimer dans JXA nécessite de démarrer manuellement NSRunLoop.

function timer (repeats, func, delay) { 
    var args = Array.prototype.slice.call(arguments, 2, -1) 
    args.unshift(this) 
    var boundFunc = func.bind.apply(func, args) 
    var operation = $.NSBlockOperation.blockOperationWithBlock(boundFunc) 
    var timer = $.NSTimer.timerWithTimeIntervalTargetSelectorUserInfoRepeats(
    delay/1000, operation, 'main', null, repeats 
) 
    $.NSRunLoop.currentRunLoop.addTimerForMode(timer, "timer") 
    return timer 
} 

function invalidate(timeoutID) { 
    timeoutID.invalidate 
} 

var setTimeout = timer.bind(undefined, false) 
var setInterval = timer.bind(undefined, true) 
var clearTimeout = invalidate 
var clearInterval = invalidate 


setTimeout(function() { 
    console.log(123) 
}, 1000) 

$.NSRunLoop.currentRunLoop.runModeBeforeDate("timer", $.NSDate.distantFuture)