使用Javascript进行自动化的setTimout

时间:2016-06-15 11:54:49

标签: javascript jxa

我尝试使用window.setTimeout,但我在运行时遇到错误:

  

第182行出错:TypeError:window.setTimeout不是函数。 (在

window.setTimeout(function(){

}, 3000);
     

window.setTimeout未定义)( - 2700)

有人可以帮助我吗?

5 个答案:

答案 0 :(得分:3)

JXA中没有任何异步。你可以使用delay(3),但不执行任何其他操作。

您可以使用$ .system(" yourCommand&")启动另一项任务,它会异步运行。这是一个异步说话的小演示。它可能是另一个执行您需要的脚本

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
  }
}

答案 1 :(得分:3)

首先,JXA没有window作为全局对象,因为它不是浏览器。 您可以通过顶级this访问全局对象,或者更简单地省略全局对象以直接访问全局变量和函数。

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

其次,JXA目前不支持setTimeout。 这是您收到setTimeout未定义的错误的重要原因。

但是,您可以使用its Objective-C bridge模仿setTimeout。 这是setTimeoutNSTimer的示例实现。 请注意,在JXA中使用NSTimer需要手动启动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)

答案 2 :(得分:2)

您可以调用全局delay(seconds)功能。

...
delay(0.2);
...

请参阅:https://github.com/dtinth/JXA-Cookbook/wiki/System-Events#example-of-sending-copy-command

答案 3 :(得分:0)

根据您的错误,调用不正确(似乎是空函数)请检查:

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

答案 4 :(得分:0)

两者都可以正常使用。



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






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