Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否有任何已编写的函数在onload完成后异步调用javascript函数?_Javascript_Ajax_Function_Asynchronous_Synchronous - Fatal编程技术网

是否有任何已编写的函数在onload完成后异步调用javascript函数?

是否有任何已编写的函数在onload完成后异步调用javascript函数?,javascript,ajax,function,asynchronous,synchronous,Javascript,Ajax,Function,Asynchronous,Synchronous,我想将一个使用XMLHttpRequest()(或ActiveXObject,如果必要的话)从服务器执行同步数据获取的javascript函数转换成一个异步函数,前提是这样做不会带来不必要的麻烦。这个函数现在可以“缓存”这样接收到的数据,因此只需要获取一次。当我只选择XMLHttpRequest()的asynchronous选项以使用提供的回调功能异步执行获取时,我的函数的调用者不会获取他们的数据,因为数据通常还没有从服务器返回,所以这一刻就失去了。数据返回后,当然没有问题,但由于许多调用必须来

我想将一个使用XMLHttpRequest()(或ActiveXObject,如果必要的话)从服务器执行同步数据获取的javascript函数转换成一个异步函数,前提是这样做不会带来不必要的麻烦。这个函数现在可以“缓存”这样接收到的数据,因此只需要获取一次。当我只选择XMLHttpRequest()的asynchronous选项以使用提供的回调功能异步执行获取时,我的函数的调用者不会获取他们的数据,因为数据通常还没有从服务器返回,所以这一刻就失去了。数据返回后,当然没有问题,但由于许多调用必须来自onload,因此它们不容易重复。(是否有一种方法可以在加载完成后“激发”inload列表中的所有函数?这可能是解决此问题的另一种方法。)

相反,当同步完成时,系统工作正常。在数据返回之前,有些事情会有一点延迟,但通常来说,这还不足以成为一个问题(到目前为止)。但是,这种用法已被弃用。例如,Firefox的开发者控制台报告:

主线程上的同步XMLHttpRequest已被弃用,因为 它会对最终用户的体验产生不利影响。需要更多帮助

由于我不知道任何其他机制(这就是这个问题的全部内容),我想我必须让调用XMLHttpRequest()的函数以某种方式跟踪它从其他函数接收到的调用,并承担起在接收到数据后执行它们所需的任何操作的责任。调用函数可能分为两部分,一部分请求数据,另一部分在数据出现时完成所需的任何操作。使用XMLHttpRequest()的函数可以实现这一点,例如,通过向其函数签名添加一些参数,例如稍后调用什么函数等等。。。我认为这是可以做到的,但这是一个不舒服的烂摊子。一定有更好的办法,我只是想想出一个

要明确的是,代码现在是同步的。我正在寻找一种更简单的方法来实现异步。看起来没那么容易

以下是同步执行此操作的代码片段:

    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从未听说过-希望