Как реализовать обратный вызов для загрузки файла?

#scripting #scripting-language #testcomplete

#сценарии #язык сценариев #тест завершен

Вопрос:

Я написал скрипт, который загружает файл из Интернета, используя URL файла. У меня есть ActiveXObject следующего типа.

 var objHTTP = new ActiveXObject("MSXML2.XMLHTTP");  
objHTTP.open("GET", strFileURL, false);
  

Это идеально работает для файлов небольшого размера, например, размер файла менее 100 МБ. Но когда я пытаюсь загрузить файл размером более 100 МБ, мой скрипт зависает. Затем я попытался,

 objHTTP.open("GET", strFileURL, true);
  

но в этом случае мы должны реализовать функцию обратного вызова. Я не знаю, как реализовать обратный вызов, а затем использовать его. Кто-нибудь может мне помочь. Я использую TestComplete 7. Сценарий, который я написал;

 var objHTTP = new ActiveXObject("MSXML2.XMLHTTP"); 
  objHTTP.open("GET", strFileURL, true); 
  objHTTP.onreadystatechange = Callback; 
  objHTTP.send();  
  while((objHTTP.readyState != 4) amp;amp; (objHTTP.readyState != 'complete'))  
  {   
    Delay(100); 
  }  
  if(200 != objHTTP.Status)  
  {  
    Log.Error("The "   strFileURL   " file was not found."   " The returned status is "   objHTTP.Status); 
    return;  
  }  
  

Я не знаю, как реализовать функцию обратного вызова. Кто-нибудь может предоставить мне реализацию?

Спасибо

Ответ №1:

Вероятно, зависание является результатом цикла while, ожидающего определенного значения свойства readyState. Если свойство никогда не получит одно из ожидаемых значений, сценарий будет работать вечно.

Я думаю, что объекту MSXML2.XMLHTTP не удается загрузить большой файл и он никогда не устанавливает readyState в одно из значений, ожидаемых вашим скриптом. Чтобы понять, что именно происходит, я бы проверил, какое значение имеет свойство по истечении очень долгого времени, которого достаточно либо для загрузки файла, либо для неудачной попытки (скажем, 2 часа). Если вы знаете, какое значение имеет свойство readyState при сбое загрузки, вы можете обработать это в скрипте, чтобы избежать зависания.

Вот и все, что касается самого зависания. Теперь о причине проблемы с загрузкой файла. Я нашел страницу, которая рассказывает о проблеме и предлагает установить более высокие таймауты — взгляните: http://edgylogic.com/blog/downloading-large-files-vbscript /

Пример приведен в VBScript, но реализовать тот же подход с помощью JScript должно быть легко. Пожалуйста, обратите внимание, что в примере используется другой COM-объект — ServerXMLHTTP. Вы можете прочитать об этом (включая отличия от XMLHTTP) здесь: http://msdn.microsoft.com/en-us/library/ms762278 (v = VS.85).aspx

Я надеюсь, что это поможет.

Комментарии:

1. О, извините, что не ответил по поводу обратного вызова. Хотя я не думаю, что использование функции обратного вызова решит проблему, использование этого подхода может помочь вам узнать значение свойства readyState, которое устанавливается при сбое загрузки. Итак, это просто: «objHTTP.onreadystatechange = OnReadyStateChange;». При этом ожидается, что функция будет объявлена в том же модуле: функция OnReadyStateChange() {/*objHTTP должна быть глобальной переменной */ Log.Message(«Состояние чтения изменено на: » objHTTP.readyState);}

2. Спасибо за ваш ответ. Проблема не в цикле while. Проблема в методе отправки, когда я отлаживал код, я обнаружил, что скрипт зависает при методе отправки. Он никогда не достигался даже в начале цикла while.

3. Хм … тогда это похоже на ошибку в компоненте. Затем я бы попробовал использовать объект ServerXMLHTTP — судя по описанию, он использует другой механизм связи, поэтому может случиться, что проблемы для него не существует. Работает ли этот компонент в вашем случае?

4. Я не проверял ServerXMLHTTP. Я проверю и обновлю. Я действительно благодарен за ваше ценное предложение.