是否有任何已编写的函数在onload完成后异步调用javascript函数?
我想将一个使用XMLHttpRequest()(或ActiveXObject,如果必要的话)从服务器执行同步数据获取的javascript函数转换成一个异步函数,前提是这样做不会带来不必要的麻烦。这个函数现在可以“缓存”这样接收到的数据,因此只需要获取一次。当我只选择XMLHttpRequest()的asynchronous选项以使用提供的回调功能异步执行获取时,我的函数的调用者不会获取他们的数据,因为数据通常还没有从服务器返回,所以这一刻就失去了。数据返回后,当然没有问题,但由于许多调用必须来自onload,因此它们不容易重复。(是否有一种方法可以在加载完成后“激发”inload列表中的所有函数?这可能是解决此问题的另一种方法。) 相反,当同步完成时,系统工作正常。在数据返回之前,有些事情会有一点延迟,但通常来说,这还不足以成为一个问题(到目前为止)。但是,这种用法已被弃用。例如,Firefox的开发者控制台报告: 主线程上的同步XMLHttpRequest已被弃用,因为 它会对最终用户的体验产生不利影响。需要更多帮助 由于我不知道任何其他机制(这就是这个问题的全部内容),我想我必须让调用XMLHttpRequest()的函数以某种方式跟踪它从其他函数接收到的调用,并承担起在接收到数据后执行它们所需的任何操作的责任。调用函数可能分为两部分,一部分请求数据,另一部分在数据出现时完成所需的任何操作。使用XMLHttpRequest()的函数可以实现这一点,例如,通过向其函数签名添加一些参数,例如稍后调用什么函数等等。。。我认为这是可以做到的,但这是一个不舒服的烂摊子。一定有更好的办法,我只是想想出一个 要明确的是,代码现在是同步的。我正在寻找一种更简单的方法来实现异步。看起来没那么容易 以下是同步执行此操作的代码片段:是否有任何已编写的函数在onload完成后异步调用javascript函数?,javascript,ajax,function,asynchronous,synchronous,Javascript,Ajax,Function,Asynchronous,Synchronous,我想将一个使用XMLHttpRequest()(或ActiveXObject,如果必要的话)从服务器执行同步数据获取的javascript函数转换成一个异步函数,前提是这样做不会带来不必要的麻烦。这个函数现在可以“缓存”这样接收到的数据,因此只需要获取一次。当我只选择XMLHttpRequest()的asynchronous选项以使用提供的回调功能异步执行获取时,我的函数的调用者不会获取他们的数据,因为数据通常还没有从服务器返回,所以这一刻就失去了。数据返回后,当然没有问题,但由于许多调用必须来
var xmlhttp;
var dn = window.location.hostname;
var srcURL = "http://"+dn+"/unpublished/latest/this.txt";
if (window.XMLHttpRequest)
{
// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp = new XMLHttpRequest();
} else {// code for IE6, IE5
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.open("POST", srcURL, false);
xmlhttp.setRequestHeader("Content-type",
"application/x-www-form-urlencoded");
xmlhttp.send("fname=Who&lname=Cares");
if (xmlhttp.readyState == 4 && xmlhttp.status==200)
{
var siteData = xmlhttp.responseText;
. . .
异步版本(在获取数据时工作正常,但对于某些调用者来说太晚了)与此非常相似。以下是其中的一个片段:
if (window.XMLHttpRequest)
{
// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp = new XMLHttpRequest();
} else {// code for IE6, IE5
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
//the callback function to be called when AJAX request comes back
xmlhttp.onreadystatechange = function()
{
if (xmlhttp.readyState == 4 && xmlhttp.status==200)
{
var siteData = xmlhttp.responseText;
... etc ...
下面是一个来电者的样子示例。请注意,getSiteData()
是包含上述代码段的函数。也就是说:
<script type = "text/javascript">
function setLinkToContact(objId)
{
document.getElementById(objId).setAttribute('href',
getSiteData('contact'));
}
</script>
函数setLinkToContact(objId)
{
document.getElementById(objId).setAttribute('href',
getSiteData(“联系人”);
}
一个
“getSiteData()”
函数有许多这样的调用者。我多次阅读您的问题,试图理解它。多个页面需要来自异步函数调用的数据。每个页面都有唯一的数据需求,这取决于异步回调
page1
var handleCallback1 = function(data){
// unique handler 1
}
page2
var handleCallback2 = function(data){
// unique handler 2
}
如果这是正确的,这里有一个方法,你可以尝试
在每个页面的顶部和异步请求开始之前,在每个页面上声明一个空的全局函数
window.myAsyncCallback = function(){}
让每个页面声明一个函数来处理异步回调
page1
var handleCallback1 = function(data){
// unique handler 1
}
page2
var handleCallback2 = function(data){
// unique handler 2
}
将handlerCallback1和handlerCallback1分配给myAsyncCallback
window.myAsyncCallback = handleCallback1;
window.myAsyncCallback = handleCallback2;
然后在onreadystatechange函数中。使用数据执行window.myAsyncCallback(数据)。当数据可用时,将触发每个具体实现。然后,你可以随时使用它,现在它是可用的
**********更新********
您是否能够更新调用“GETSITEDATA(‘联系’)”?“如果是的话,可能考虑调用GETSITDATA.CALL()函数,并将其引用给需要网络数据的DOM元素。然后在getSiteData中,设置元素的dataset值。将元素存储在数组中,以便在网络请求完成后可以检索它。然后遍历元素列表,查找它的值,并根据需要进行更新,因为您将有对dom元素的引用
如果您无法修改调用者函数,请尝试使用函数原型。重构可能需要很多工作,但似乎是避免引入竞争条件的最佳选择。如果您为异步进行重构,那么函数回调应该适合您,而不必使用Promissions和EventListeners;这两种方法都是很好的选择,但是回调可以满足您的需求
我很想知道你是怎么解决的。如果可能的话,随时通知我
<title></title>
<script>
var elements = [];
var getSiteData = function(elem, value){
// set element data
elem.dataset = value;
// store
elements.push(elem);
// mimic async request
setTimeout(function(){
var xmlHttpData = {
"contact":"http://www.yahoo.com",
"contacttwo":"http://www.google.com"
}
linklist.forEach(function(element, index, arr){
// match dataset value in element to xmlHttpData.
//element.dataset.value
})
},3000);
}
function setLinkToContact(objId){
document.getElementById(objId).setAttribute('href',
getSiteData.call(document.getElementById(objId),'contact'));
}
</script>
<body>
<a id="link" href="">my link</a>
<div id="linktwo">my link</a>
<script>
setLinkToContact('link');
setLinkToContact('linktwo');
</script>
</body>
var元素=[];
var getSiteData=函数(元素,值){
//设置元素数据
elem.dataset=值;
//贮藏
元素推送(elem);
//模拟异步请求
setTimeout(函数(){
var xmlHttpData={
“联系人”:http://www.yahoo.com",
“联系人二”:http://www.google.com"
}
forEach(函数(元素、索引、arr){
//将元素中的数据集值与xmlHttpData匹配。
//element.dataset.value
})
},3000);
}
函数setLinkToContact(objId){
document.getElementById(objId).setAttribute('href',
调用(document.getElementById(objId),'contact');
}
我的链接
setLinkToContact(“链接”);
setLinkToContact('linktwo');
似乎有帮助?您是否试图在文档加载的DOMContentLoaded
或窗口加载
事件之前从服务器请求数据并接收响应?具体要求是什么?@Paibumber从未听说过-希望