调用 jqXHR.done() 的异步函数

Async function that calls jqXHR.done()

我有一个异步函数,它调用一个 returns 一个 jQuery XMLHTTPRequest (jqXHR) 对象的函数,完成后,它会做一些工作并调用回调。不幸的是,当我在 async.waterfall() 中的其他函数之前和之后使用所述函数时,函数的 .done() 似乎被调用 after 其他所有事情都已经完成(包括函数在此之后,以及 async.waterfall() 末尾的 success/fail 回调。

函数定义如下所示:

function snapPotholeCoordsToRoad(potholeCollection, callback)
{
    var DEBUG = true;
    // guarantee that callback is function
    if ((callback) && (typeof(callback) !== 'function')) throw new TypeError('callback is something, but not a function. Thrown from snapPotholeCoordsToRoad().');
    // for each element of potholeCoordinates
    for (var key in potholeCoordinates)
    {
        (function itr(k, m) { 
            if (m === potholeCoordinates[key].length) return;
            if (DEBUG) console.log('called before the jqXHR.done()');
            // if element (PotholeData) not snapped to road
            if (!potholeCoordinates[k][m].isSnappedToRoad())
            {
                // get road coordinates for element
                getRoadCoordinates(potholeCoordinates[k][m])
                // replace element's coordinates with those road coordinates
                .done(function(newCoords) { 
                    potholeCoordinates[k][m].setCoordinates(newCoords.snappedPoints[0].location);
                    potholeCoordinates[k][m].isSnappedToRoad(true);
                    if (DEBUG) console.log('called after jqXHR.done()');
                    itr(k, m+1);
                })
            }
            else itr(k, m+1);
        })(key, 0);
    }
    if (callback)
    {
        callback(null);
    }
}

其中 potholeCoordinatesPotholeData Array 中的 Object

getRoadCoordinates() 看起来像这样:

/* snaps the coordinates to the nearest road
 * Parameters:
 *  • coords : coordinates object`
 * Returns: 
 *  • coordinates, snapped to road 
 * NOTE: the points you're looking for are accessible via the snappedPoints member of the returned object (in done() or success()) 
 */
function getRoadCoordinates(coords)
{
    return $.ajax({
        type: 'get',
        url : 'https://roads.googleapis.com/v1/snapToRoads',
        data: { 
            key : API_KEY,
            interpolate : true,
            path : coords.lat + ', ' + coords.lng
        }
     });
}

...async.waterfall() 是这样的:

async.waterfall([//fetchServerPotholeData,  // for some reason, this function is not receiving data
            function(callback) { 
                fetchServerPotholeData(data, callback);
            },
            fetchRoadCoords,
            snapPotholeCoordsToRoad,
            addPotholeMarkers
            ], function(err, result) { 
                if (!err) { 
                    console.log('result == ' + result);
                    console.log('Everything successfully done. Enjoy your map!'); 

                }
                else 
                {
                    console.error(err);
                }
            }
        )

/* 它位于传递它的函数中 data。 */

在运行时,我得到类似于以下的控制台输出:

called before the jqXHR.done()
result == undefined
Everything successfully done. Enjoy your map!
called after jqXHR.done()

我必须更改什么才能使 .done() 在这些循环内的滴答期间执行,然后是其余代码?

我刚刚修复了错误,担心了一整天后,在此处发布后的几分钟内!

我做了什么

在第一个 for 循环之前,我保存了 potholeCoordinates

键的副本
var keys = Object.keys(potholeCoordinates);

在那个 .done() 回调中,在最后,就在

之前
itr(k, m+1);

我检查我是否在最后一个数组中的最后一个对象上,使用:

if ((k === keys[keys.length - 1]) && (callback)) return callback(null);

编辑:我忘了包括我取消了

if (callback) 
{
    callback(null);
}

在 for 循环之外

/* 我现在可能应该着手重构这段代码,以便像它们应该的那样实际使用它的参数.... */