setTimeout, не работающий в сценарии окон (jscript)

Когда я пытаюсь выполнить следующий код в своей программе

setTimeout("alert('moo')", 1000);

Я получаю следующую ошибку

Error: Object expected
Code: 800A138F
Source: Microsoft JScript runtime error

Почему? Я вызываю неправильную функцию? То, что я хочу сделать, задержать выполнение последующей функции.

6
задан Ja͢ck 6 June 2014 в 05:56
поделиться

3 ответа

StartCity отлично работает с C #\Msbuild и свободен от обвинения до 20 разработчиков.

-121--4055840-

setTimeout - метод объекта окна , предоставляемый веб-браузерами. Он недоступен для сценариев, запущенных на узле сценариев Windows. Эти сценарии имеют один поток выполнения от начала до конца и не имеют таймеров задержки.

Если требуется приостановить выполнение сценария, можно использовать метод Sleep объекта WScript .

-121--4154892-

Похоже, что вы используете setTimeout в сценарии, не основанном на браузере (Windows Script Host или аналогичном). Ты не можешь этого сделать. Однако можно использовать WScript.Sleep , чтобы ненадолго приостановить сценарий, с помощью которого можно добиться аналогичного эффекта. Кроме того, аларм не является функцией WSH; может потребоваться WScript.Echo . Подробнее о ссылке WSH на MSDN .

8
ответ дан 8 December 2019 в 12:59
поделиться

setTimeout - это метод объекта window , предоставляемый веб-браузерами. Это недоступно для скриптов, работающих на Windows Script Host. Эти сценарии имеют один поток выполнения от начала до конца и не имеют таймеров задержки.

Если вы хотите приостановить выполнение скрипта, вы можете использовать метод Sleep объекта WScript .

6
ответ дан 8 December 2019 в 12:59
поделиться

Мне нужно, чтобы WSH вел себя как аналогичный код в браузере, использующем setTimeout, поэтому вот что я придумал.

Просто пусть ваш единственный поток выполняет все в очереди. Вы можете продолжать добавлять в очередь. Программа завершится только тогда, когда в очереди не останется функций.

Он не поддерживает строки для eval, только функции.

function main() {
  Test.before();
  _setTimeout(Test.timeout1, 1000);
  _setTimeout(Test.timeout2, 2000);
  _setTimeout(Test.timeout3, 500);
  _setTimeout(Test.error, 2001);
  Test.after();
}

var Test = function() {
  var ld = "---- ";
  var rd = " ----";
  return {
    before : function() {
      log(ld + "Before" + rd);
    },
    after : function() {
      log(ld + "After" + rd);
    },
    timeout1 : function() {
      log(ld + "Timeout1" + rd);
    },
    timeout2 : function() {
      log(ld + "Timeout2" + rd);
    },
    timeout3 : function() {
      log(ld + "Timeout3" + rd);
    },
    error : function() {
      log(ld + "error" + rd);
      errorFunc();
    }
  };
}();

var FuncQueue = function() {
  var funcQueue = [];
  function FuncItem(name, func, waitTil) {
    this.name = name;
    this.func = func;
    this.waitTil = waitTil;
  }
  return {
    add : function(func, name, waitTil) {
      funcQueue.push(new FuncItem(name, func, waitTil));
    },
    run : function() {
      while (funcQueue.length > 0) {
        var now = new Date().valueOf();
        for ( var i = 0; i < funcQueue.length; i++) {
          var item = funcQueue[i];
          if (item.waitTil > now) {
            continue;
          } else {
            funcQueue.splice(i, 1);
          }
          log("Executing: " + item.name);
          try {
            item.func();
          } catch (e) {
            log("Unexpected error occured");
          }
          log("Completed executing: " + item.name);
          break;
        }
        if (funcQueue.length > 0 && i > 0) {
          if (typeof (WScript) != "undefined") {
            WScript.Sleep(50);
          }
        }
      }
      log("Exhausted function queue");
    }
  }
}();

function _setTimeout(func, delayMs) {
  var retval = undefined;
  if (typeof (setTimeout) != "undefined") {
    retval = setTimeout(func, delayMs); // use the real thing if available
  } else {
    FuncQueue.add(func, "setTimeout", new Date().valueOf() + delayMs);
  }
  return retval;
}

var log = function() {
  function ms() {
    if (!ms.start) {
      ms.start = new Date().valueOf();
    }
    return new Date().valueOf() - ms.start; // report ms since first call to function
  }
  function pad(s, n) {
    s += "";
    var filler = "     ";
    if (s.length < n) {
      return filler.substr(0, n - s.length) + s;
    }
    return s;
  }
  return function(s) {
    if (typeof (WScript) != "undefined") {
      WScript.StdOut.WriteLine(pad(ms(), 6) + " " + s);
    } else {
      // find a different method
    }
  }
}();

FuncQueue.add(main, "main");
FuncQueue.run();
4
ответ дан 8 December 2019 в 12:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: