Javascript 是否从延迟服务器返回数据?
我有一个使用谷歌places服务的类。用户可以输入地址,谷歌将返回有关该地址的信息 稍后我想找出这个地方的纬度和液化天然气坐标,所以我有一个方法,它将谷歌的places服务统一化,以获得坐标 由于这可能需要一些时间,我将返回一个延迟的Javascript 是否从延迟服务器返回数据?,javascript,jquery,Javascript,Jquery,我有一个使用谷歌places服务的类。用户可以输入地址,谷歌将返回有关该地址的信息 稍后我想找出这个地方的纬度和液化天然气坐标,所以我有一个方法,它将谷歌的places服务统一化,以获得坐标 由于这可能需要一些时间,我将返回一个延迟的 p.getLatLong = function() { var dfd = $.Deferred(); this.placesService.getDetails({ reference: this.pacRef
p.getLatLong = function() {
var dfd = $.Deferred();
this.placesService.getDetails({
reference: this.pacReference
}, function(details, status){
if(details){
dfd.resolve({'lat' : details.geometry.location.lat(), 'lng' : details.geometry.location.lng()});
}
else{
dfd.reject();
}
})
}
return dfd;
};
我希望能够访问上述方法并只返回coords或null(如果dfd被拒绝),但该方法返回一个延迟值
如何只返回dfd的结果而不是dfd本身
我不想打电话:
this.geo.getLatLng().done(function(data){console.log(data})
但是像这样的事情:
console.log(this.geo.getLatLng());
我明白你的意思,尽管承诺的存在是有原因的,这里的原因是请求数据的异步性质
有一种方法,在我理解承诺的目标之前,我曾经认为它是好的。您可以返回“待填充”数据的引用,但什么时候才能使用它?您是否计划轮询对象的状态。。。?我希望不是,认真地遵守承诺,您将避免许多问题,只需一系列按键操作即可获得微利。延迟对象旨在允许线程在后台继续执行长时间运行的操作。它们有特定的用途,不应该像你设计的那样工作 记住JavaScript是单线程的。这意味着,如果您暂停线程等待一个长操作完成,整个页面/UI也将被冻结
该警告指出,您可以通过使用一个检查流程是否完成的循环将所有这些内容包装到您自己的闭包中,从而实现您想要的 请注意这是危险的,会冻结页面,应避免。此处仅出于学术原因。
var getGetLatLng = (function () {
var running = false;
return function () {
var latlng;
//While we haven't instructed the loop to break.
while (!breakLoop) {
//If we haven't instructed the API call to execute in this iteration of the loop.
if (!running) {
//On next iteration, tell it we are already running, to prevent multiple requests being fired.
running = true;
//Your logic here for getLatLng
this.geo.getLatLng()
//When it completes successfully, set latlng
.done(function (data) {
latlng = data;
})
//always break the loop when HTTP completes.
.always(function () {
breakLoop = true;
});
}
}
//Return latlng - it could be undefined if there was an error.
return latlng;
};
})();
您也可以在原始的p.getLatLng
函数体周围使用相同的结构。再说一次,我不推荐它