Нет данных в обратном вызове: как приостановить загрузку функции JavaScript - PullRequest
1 голос
/ 28 июля 2011

У нас возникла проблема в следующем коде JavaScript.

Функция doCallback выполняется до завершения doMainProcess.

Так что каждый раз, когда мы получаем result = null в doCallback.

Есть ли способ приостановить загрузку doCallback, чтобы дождаться получения результата?

Редактировать: setResult происходит несколько раз и является асинхронным с помощью iframe, и мы не знаем время. Также обратный вызов происходит только в то время, которое определено другим процессом.

Так что мы не можем просто изменить позицию doCallback.

<html>
<head>
<script>
 var result;
 var callback = "callback";
 var url = "http://www.example2.com/getResponse/";

 function iframeCallback() {
    var iframe = document.createElement('iframe');
    iframe.style.border='0px';
    iframe.style.width ='0px';
    iframe.style.height='0px';
    document.body.appendChild(iframe);
    var iDocument;
    if (iframe.contentDocument) {
        iDocument = iframe.contentDocument; 
    } else if (iframe.contentWindow) {
        iDocument = iframe.contentWindow.document;
    } else if (iframe.document) {
        iDocument = iframe.document;
    }
    var content = "<script type='text/javascript'>";
    content += "var jsText = \"<script type='text/javascript' src='" + url + "'></\" + \"script>\";";
    content += "document.write(jsText);";
    content += "</"+"script>";
    content += "<script type='text/javascript'>";
    content += "var data = eval('"+callback+"');";
    content += "window.parent.setResult(data);";
    content += "</"+"script>";
    iDocument.open();
    iDocument.write(content);
    iDocument.close();
}

function setResult(data) {
    result = data;
}
function doMainProcess() {

    iframeCallback()
}

function doCallback() {

            //we need to wait here until we get the result.

    alert(result);
}
</script>
</head>
<body>
<script>
    doMainProcess();
</script>
<script>
    doCallback();
</script>
</body>
<html>

Ответы [ 2 ]

2 голосов
/ 28 июля 2011

Да,

удалить это:

<script>
   doCallback();
</script>

Изменить это:

function setResult(data) {
    result = data;
}

к этому:

function setResult(data) {
    result = data;
    doCallback();
}
0 голосов
/ 28 июля 2011

Неуклюжее решение (которое не требует тщательного прочтения вашего кода):

var readyForCallback = false;

function doMainProcess() {
  // your code here

  readyForCallback = true;
}

function doCallback(arg1,arg2,arg3,etc) {
  if (!readyForCallback) {
    // anonymous function as way to keep the original callback
    // argument(s) with a timeout 
    setTimeout(function(){doCallback(arg1,arg2,arg3,etc);},20);
    return;
  }

  // your code here
}

Примечание: в вашей функции тайм-аута вы также можете использовать doCallback.apply() с объектом arguments для автоматической обработки любого количества аргументов, но я не включил это в свой код, потому что я забыл, можете ли вы просто используйте объект arguments напрямую или, если вам необходимо сначала создать правильный массив, заполненный из arguments.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...