回调中没有数据:如何暂停加载javascript函数

时间:2011-07-27 23:52:54

标签: javascript callback

我们在以下javascript代码中遇到了问题。

在doMainProcess完成之前,

doCallback函数正在发生。

所以每次我们在doCallback中得到result = null。

有没有办法暂停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 个答案:

答案 0 :(得分:2)

是,

删除此:

<script>
   doCallback();
</script>

改变这个:

function setResult(data) {
    result = data;
}

到此:

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

答案 1 :(得分:0)

一个笨重的解决方案(不涉及我必须仔细阅读您的代码):

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填充的正确数组。