调用 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);
}
}
其中 potholeCoordinates
是 PotholeData
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 循环之外
/* 我现在可能应该着手重构这段代码,以便像它们应该的那样实际使用它的参数.... */
我有一个异步函数,它调用一个 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);
}
}
其中 potholeCoordinates
是 PotholeData
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 循环之外
/* 我现在可能应该着手重构这段代码,以便像它们应该的那样实际使用它的参数.... */