Javascript 如何使用$.Deferred和额外回调函数构建处理数组的函数
我需要通过这里的地图地理编码器处理数据列表,以便将locationId转换为坐标。geocoder类具有接受3个参数1个参数2的geocode函数。成功调用函数3。failCallFunctionJavascript 如何使用$.Deferred和额外回调函数构建处理数组的函数,javascript,jquery,here-api,Javascript,Jquery,Here Api,我需要通过这里的地图地理编码器处理数据列表,以便将locationId转换为坐标。geocoder类具有接受3个参数1个参数2的geocode函数。成功调用函数3。failCallFunction self.geocodeByLocationIdByArray = function (locationIds, callback) { var deferred = $.Deferred(); var res
self.geocodeByLocationIdByArray = function (locationIds, callback)
{
var deferred = $.Deferred();
var result = [];
var convert = function () {
for (var i = 0; i < locationIds.length - 1; i++)
{
geocodingParameters = {
locationId: locationIds[i].locationId;
};
self.geocoder.geocoder(geocodingParameters, onGeocodeSuccess, function () { });
}
};
convert();
return deferred.promise();
};
onGeocodeSuccess = function (result) {
var locations = result.Response.View[0].Result,
i;
var result = [];
// Add a marker for each location found
for (i = 0; i < locations.length; i++) {
result.push(new geoCoordinate(locations[i].Location.DisplayPosition.Latitude, locations[i].Location.DisplayPosition.Longitude));
}
return result;
};
self.geocodeByLocationIdByArray=函数(locationId,回调)
{
var deferred=$.deferred();
var结果=[];
var convert=函数(){
对于(var i=0;i
如何修复geocodeByLocationIdByArray函数的等待,直到所有数据都在前面并返回结果数组?我有点停下来:(我的问题是geocoder是异步的。您可以提示geocoder方法,这样它就不会得到回调作为参数,而是返回一个承诺。然后您可以创建一个承诺数组,每个承诺都由这个新函数创建。最后,您可以使用$。当
等待所有这些承诺解析时,将结果连接到d将其作为整个geocodeByLocationIdByArray方法的承诺值返回
这是未经测试的代码,但您会明白:
self.geocodeByLocationIdByArray = function (locationIds) {
// Promisify geocoder:
function geocoderPromise(geocodingParameters) {
var deferred = $.Deferred();
self.geocoder.geocoder(geocodingParameters, function () {
deferred.resolve(result);
}, function (err) {
deferred.reject(err);
});
return deferred.promise();
}
// Create an array of promises
var promises = locationIds.map(function (locationId) {
var geocodingParameters = {
locationId: locationIds[i].locationId;
};
return geocoderPromise(geocodingParameters)
.then(onGeocodeSuccess)
.catch(function (err) { // or `fail` in jQuery < 3.0
console.log('geocoder error occurred', err);
});
});
// Wait for all promises to be resolved, and then concatenate the results
// as the final promised value.
return $.when.apply($, promises).then(function () {
return [].concat.apply([], arguments);
});
};
您可以提示geocoder方法,这样它就不会得到回调作为参数,而是返回一个承诺。然后您可以创建一个承诺数组,每个承诺都是由这个新函数创建的。最后,您可以使用$。当等待所有这些承诺解析时,连接结果并将其作为ov的承诺值返回通用地理编码定位法
这是未经测试的代码,但您会明白:
self.geocodeByLocationIdByArray = function (locationIds) {
// Promisify geocoder:
function geocoderPromise(geocodingParameters) {
var deferred = $.Deferred();
self.geocoder.geocoder(geocodingParameters, function () {
deferred.resolve(result);
}, function (err) {
deferred.reject(err);
});
return deferred.promise();
}
// Create an array of promises
var promises = locationIds.map(function (locationId) {
var geocodingParameters = {
locationId: locationIds[i].locationId;
};
return geocoderPromise(geocodingParameters)
.then(onGeocodeSuccess)
.catch(function (err) { // or `fail` in jQuery < 3.0
console.log('geocoder error occurred', err);
});
});
// Wait for all promises to be resolved, and then concatenate the results
// as the final promised value.
return $.when.apply($, promises).then(function () {
return [].concat.apply([], arguments);
});
};
您不能的可能重复,因为它是异步的。看起来您正在传入回调函数,为什么不在得到结果后调用该函数?您选择使用$的原因是什么?延迟而不是ES6承诺?您不能的可能重复,因为它是异步的。看起来您正在传入回调函数,为什么不一旦你得到结果,我就不调用那个函数了?你为什么选择使用$。延迟而不是ES6承诺?谢谢。这个想法非常好!我刚刚在catch(function(err){console.log('geocoder error accurrent',err);})中遇到一个错误;似乎catch不是一个函数是的,catch
只是在jQuery 3.0中引入的。您可以不使用它,或者使用fail
来代替。谢谢。这个想法很好!我刚刚在catch(function(err){console.log('geocoder error ocater',err err);)中遇到一个错误;看来catch不是一个函数h是的,catch
只是在jQuery 3.0中引入的。您可以不使用它,或者改用fail
。