2016-06-15 4 views
1

Я пытался использовать window.setTimeout, но я получаю сообщение об ошибке во время выполнения:setTimout с Javascript для автоматизации

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

window.setTimeout(function(){ 

}, 3000); 

, window.setTimeout is undefined) (-2700)

Может кто-нибудь мне помочь?

+2

Пожалуйста, вы можете разместить свой код? –

+1

Довольно описательное сообщение об ошибке. Таким образом, у вас нет setTimeOut в JXA - возможно, delay() будет работать – mplungjan

+0

Или удалите окно. от него, так как нет окна – mplungjan

ответ

0

В соответствии с вашей ошибкой, вызов не правильно (это кажется пустой функции) проверить это:

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

+0

у меня такое же сообщение об ошибке: Ошибка в строке 1: ReferenceError: не удается найти переменную: setTimeout – Mermoz

0

Оба будут работать нормально.

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

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

+0

Я попытался запустить ее в редакторе сценариев Apple, и я получаю ту же ошибку: Ошибка в строке 1: ReferenceError: Не удается найти переменную: setTimeout – Mermoz

3

Существует ничего асинхронной в JXA. Вы можете использовать задержку (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 
    } 
} 
+0

Хорошо спасибо за ваш ответ. Но задержка вызова вызывает системный вызов, и я хотел обновить пользовательский интерфейс моего приложения с задержкой (или JS setInterval). Хорошо, что в JXA нет ничего асинхронного. – Mermoz

+0

Я полагаю, что вашей единственной альтернативой является блокировка задержки (2). Как асинхронный парень, я нашел это неприятным. –

2

Во-первых, JXA не window как глобальный объект, потому что это не браузер. Вы можете получить доступ к глобальному объекту через верхний уровень this или, проще говоря, опустить глобальный объект для доступа к глобальным переменным и функциям напрямую.

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

Во-вторых, JXA не имеет поддержки setTimeout в настоящее время. Это основная причина, по которой вы получили сообщение об ошибке, которое setTimeout не определено.

Однако вы можете эмулировать setTimeout с its Objective-C bridge. Это пример реализации setTimeout с NSTimer. Обратите внимание, что для работы с NSTimer в JXA необходимо запустить 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) 
Смежные вопросы