Javascript 如何使用$.Deferred和额外回调函数构建处理数组的函数

Javascript 如何使用$.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

我需要通过这里的地图地理编码器处理数据列表,以便将locationId转换为坐标。geocoder类具有接受3个参数1个参数2的geocode函数。成功调用函数3。failCallFunction

  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