我们在以下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>
答案 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
填充的正确数组。