Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/399.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
在Javascript中创建异步函数_Javascript_Asynchronous - Fatal编程技术网

在Javascript中创建异步函数

在Javascript中创建异步函数,javascript,asynchronous,Javascript,Asynchronous,我有一个模块,它包装了一个对异步方法的调用,以监视浏览器的geolocationnavigator.geolocation.watchPosition var geo_value; //Initialises the devices geolocation navigator.geolocation.watchPosition(function (position) { geo_value = position.coords.longitude + "," + position.coo

我有一个模块,它包装了一个对异步方法的调用,以监视浏览器的geolocation
navigator.geolocation.watchPosition

var geo_value;

//Initialises the devices geolocation
navigator.geolocation.watchPosition(function (position) {
    geo_value = position.coords.longitude + "," + position.coords.latitude;
});
每次调用
watchPosition
方法时,我都会将该值存储在一个变量中,以便在任何给定时间对
currentPosition
进行编程访问

这一切都很好,但是我现在想通过从模块导出的自定义异步方法公开这个
currentPosition

define(["global"], function (window) {

   var navigator = window.navigator;

   var geo_value;

   //Initialises the devices geolocation
   navigator.geolocation.watchPosition(function (position) {
       geo_value = position.coords.longitude + "," + position.coords.latitude;
   });


   return {
       currentPosition: function (callback) {
           setTimeout(function () {
               while (!geo_value) {
                   //keep looping until geo_value has been initially set by the watch position above
               }
               //geo_value has been set, execute callback
               callback(geo_value);
           }, 0);

       }
   };
});
我已经让
模块
公开
当前位置
,如果
geo_值
已经设置,它就可以工作,但是如果
geo_值
还没有设置,我还希望它异步等待,然后在
watchPosition
最终为
geo_值
设置值时执行回调。我尝试使用
setTimeout
函数尝试使其异步,但没有成功


任何帮助都将不胜感激。

因此,Javascript实际上是一个单线程事件循环。了解这到底意味着什么需要经验

define(["global"], function (window) {

   var navigator = window.navigator;

   var geo_value;
   var cb;

   //Initialises the devices geolocation
   navigator.geolocation.watchPosition(function (position) {
       geo_value = position.coords.longitude + "," + position.coords.latitude;
       if (cb) {
         cb(geo_value);
         cb = null;
       }
   });


   return {
       currentPosition: function (callback) {
        if (geo_value) {
            callback(geo_value);
        } else {
            cb = callback;
        }
   };
});
在这种情况下,这意味着您的while循环将永远不会终止,因为在运行时不会发生其他任何事情

一个更好的方法是在调用watchPosition时,将作为参数得到的回调调用到currentPosition

define(["global"], function (window) {

   var navigator = window.navigator,
       geo_value,
       callbacks = [],


   //Initialises the devices geolocation
   navigator.geolocation.watchPosition(function (position) {
       geo_value = position.coords.longitude + "," + position.coords.latitude;

       // Update all callbacks with new value. 
       for (var i = 0; i < callbacks.length; i++) {
           callbacks[i](geo_value);
       }
   });


   return {
       onCurrentPosition: function (callback) {
           callbacks.push(callback)
       }
   };
});
定义([“全局”],函数(窗口){
var navigator=window.navigator,
地价,
回调=[],
//初始化设备地理位置
navigator.geolocation.watchPosition(函数(位置){
geo_值=position.coords.longitude+“,”+position.coords.lation;
//用新值更新所有回调。
for(var i=0;i因此,Javascript实际上是一个单线程事件循环。了解这到底意味着什么需要经验

在这种情况下,这意味着您的while循环将永远不会终止,因为在运行时不会发生其他任何事情

一个更好的方法是在调用watchPosition时,将作为参数得到的回调调用到currentPosition

define(["global"], function (window) {

   var navigator = window.navigator,
       geo_value,
       callbacks = [],


   //Initialises the devices geolocation
   navigator.geolocation.watchPosition(function (position) {
       geo_value = position.coords.longitude + "," + position.coords.latitude;

       // Update all callbacks with new value. 
       for (var i = 0; i < callbacks.length; i++) {
           callbacks[i](geo_value);
       }
   });


   return {
       onCurrentPosition: function (callback) {
           callbacks.push(callback)
       }
   };
});
定义([“全局”],函数(窗口){
var navigator=window.navigator,
地价,
回调=[],
//初始化设备地理位置
navigator.geolocation.watchPosition(函数(位置){
geo_值=position.coords.longitude+“,”+position.coords.lation;
//用新值更新所有回调。
for(var i=0;i因此,Javascript实际上是一个单线程事件循环。了解这到底意味着什么需要经验

在这种情况下,这意味着您的while循环将永远不会终止,因为在运行时不会发生其他任何事情

一个更好的方法是在调用watchPosition时,将作为参数得到的回调调用到currentPosition

define(["global"], function (window) {

   var navigator = window.navigator,
       geo_value,
       callbacks = [],


   //Initialises the devices geolocation
   navigator.geolocation.watchPosition(function (position) {
       geo_value = position.coords.longitude + "," + position.coords.latitude;

       // Update all callbacks with new value. 
       for (var i = 0; i < callbacks.length; i++) {
           callbacks[i](geo_value);
       }
   });


   return {
       onCurrentPosition: function (callback) {
           callbacks.push(callback)
       }
   };
});
定义([“全局”],函数(窗口){
var navigator=window.navigator,
地价,
回调=[],
//初始化设备地理位置
navigator.geolocation.watchPosition(函数(位置){
geo_值=position.coords.longitude+“,”+position.coords.lation;
//用新值更新所有回调。
for(var i=0;i因此,Javascript实际上是一个单线程事件循环。了解这到底意味着什么需要经验

在这种情况下,这意味着您的while循环将永远不会终止,因为在运行时不会发生其他任何事情

一个更好的方法是在调用watchPosition时,将作为参数得到的回调调用到currentPosition

define(["global"], function (window) {

   var navigator = window.navigator,
       geo_value,
       callbacks = [],


   //Initialises the devices geolocation
   navigator.geolocation.watchPosition(function (position) {
       geo_value = position.coords.longitude + "," + position.coords.latitude;

       // Update all callbacks with new value. 
       for (var i = 0; i < callbacks.length; i++) {
           callbacks[i](geo_value);
       }
   });


   return {
       onCurrentPosition: function (callback) {
           callbacks.push(callback)
       }
   };
});
定义([“全局”],函数(窗口){
var navigator=window.navigator,
地价,
回调=[],
//初始化设备地理位置
navigator.geolocation.watchPosition(函数(位置){
geo_值=position.coords.longitude+“,”+position.coords.lation;
//用新值更新所有回调。
for(var i=0;i
下面的代码会阻止要执行的其他代码,因为JavaScript只有一个执行线程:

while (!geo_value) {
    //keep looping until geo_value has been initially set by the watch position above
}
相反,请尝试以下方法:

currentPosition: function(callback) {
  if (geo_value) {
    callback(geo_value);
  } else {
    // try again 1 sec later
    setTimeout(this.currentPosition.bind(this, callback), 1000);
  }
}

下面的代码会阻止要执行的其他代码,因为JavaScript只有一个执行线程:

while (!geo_value) {
    //keep looping until geo_value has been initially set by the watch position above
}
相反,请尝试以下方法:

currentPosition: function(callback) {
  if (geo_value) {
    callback(geo_value);
  } else {
    // try again 1 sec later
    setTimeout(this.currentPosition.bind(this, callback), 1000);
  }
}

下面的代码会阻止要执行的其他代码,因为JavaScript只有一个执行线程:

while (!geo_value) {
    //keep looping until geo_value has been initially set by the watch position above
}
相反,请尝试以下方法:

currentPosition: function(callback) {
  if (geo_value) {
    callback(geo_value);
  } else {
    // try again 1 sec later
    setTimeout(this.currentPosition.bind(this, callback), 1000);
  }
}

下面的代码会阻止要执行的其他代码,因为JavaScript只有一个执行线程:

while (!geo_value) {
    //keep looping until geo_value has been initially set by the watch position above
}
相反,请尝试以下方法:

currentPosition: function(callback) {
  if (geo_value) {
    callback(geo_value);
  } else {
    // try again 1 sec later
    setTimeout(this.currentPosition.bind(this, callback), 1000);
  }
}

唯一的问题是,您现在无法从缓存
geo\u值中获益。如果存在
geo_value
,则应立即调用回调并将其推入回调中。另外,据我所知,OP不想在以后的职位变动中得到通知,所以一旦你有了职位,你就不需要推送任何回调,只需返回当前的回调。我会将此标记为解释的答案,但@Close下面的答案经过一些修改后更接近