在Javascript中创建异步函数
我有一个模块,它包装了一个对异步方法的调用,以监视浏览器的geolocation在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
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下面的答案经过一些修改后更接近