我尝试使用window.setTimeout
,但我在运行时遇到错误:
第182行出错:TypeError:window.setTimeout不是函数。 (在
window.setTimeout(function(){ }, 3000);
,
window.setTimeout
未定义)( - 2700)
有人可以帮助我吗?
答案 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
。
这是setTimeout
与NSTimer
的示例实现。
请注意,在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);