【发布时间】:2014-09-20 14:01:22
【问题描述】:
这是我的(简单)问题:
我有一个 Javascript 函数,它调用外部 API 以异步获取一些结果。我需要等待这些结果,因为我想对它们进行一些测试以确定它们是否有效,但Deferred 对我来说非常复杂,我无法成功。
这是我所做的:
$("#step-content").steps({
//some parameters
onStepChanging: function(event, currentIndex, newIndex) {
verifyAddress().done(function(test) {
if($("#hdnLatitude").val() == "" || $("#hdnLongitude").val() == "")
test = false;
else
test = true;
console.log(test); // test is true or false, that's good
return test;
});
console.log(test); // test is always empty here
//Here, I just need to do return true or return false to block step-changing if there is an error.
return test;
}
});
基本上,这是我的verifyAddress 函数:
function verifyAddress() {
var r = $.Deferred();
var geocoder = new google.maps.Geocoder();
if (geocoder) {
var adressToGeocode = /* Get the address to geocode */
geocoder.geocode({ 'address': adressToGeocode }, function (results, status) {
if (status == google.maps.GeocoderStatus.OK)
{
//Save the lat/lng returned in #hdnLatitude and #hdnLongitude
}
r.resolve();
});
}
//Not sure where to place the return r ; try elsewhere but no success
return r;
}
所以我需要等待verifyAdress() 结束并填充#hdnLatitude 和#hdnLongitude,然后在onStepChanging 事件中返回true 或false确定我们是否可以进行下一步(地址是可以的)而不是(地址是错误的)
我使用this SO question 来更好地理解Deferred,但我无法成功。
有人可以帮助我吗?
非常感谢
【问题讨论】:
-
如何从异步函数返回。经典。看看here,了解为什么你做不到。
-
嗨。我知道这对于像我这样的初学者来说是一个经典问题,但我真的需要帮助来理解这个问题。我看过这个链接,我是否必须将回调传递给我的
verifyAddress()方法?我无法理解底层逻辑...... -
@guest271314:以this question 为例。无论您是采用回调还是返回延迟都没有区别,您无法从
onStepChanging方法同步return true/false。 -
@AlexB:是的,这真的是不可能的。您不能忙于等待异步结果。您的问题的解决方案是选择一个不同的
steps插件,一个可以处理异步功能的插件。 -
这是另一个解释异步性质的问题:stackoverflow.com/questions/23667086/…。问题是您使用的是第三方库,它期望代码是同步的。当需要同步代码时,您不能使用异步代码。正如 Bergi 所说,您需要找到另一个插件。
标签: javascript jquery asynchronous jquery-deferred deferred