Обходные пути выше (спасибо!) неправильно решают проблему возврата объектов, предоставленных методу отложенного resolve()
, потому что jQuery вызывает обратные вызовы done()
и fail()
с отдельными параметрами, а не с массивом. Это означает, что мы должны использовать псевдо-массив arguments
, чтобы получить все разрешенные / отклоненные объекты, возвращенные массивом отложенных, что является уродливым:
$.when.apply($,deferreds).then(function() {
var objects=arguments; // The array of resolved objects as a pseudo-array
...
};
Поскольку мы прошли в массиве отложенных , было бы неплохо вернуть массив результатов. Также было бы неплохо вернуть фактический массив вместо псевдо-массива, чтобы мы могли использовать такие методы, как Array.sort()
.
Вот решение, основанное на методе метода [.9], который обращается к этим Проблемы:
// Put somewhere in your scripting environment
if (typeof jQuery.when.all === 'undefined') {
jQuery.when.all = function (deferreds) {
return $.Deferred(function (def) {
$.when.apply(jQuery, deferreds).then(
function () {
def.resolveWith(this, [Array.prototype.slice.call(arguments)]);
},
function () {
def.rejectWith(this, [Array.prototype.slice.call(arguments)]);
});
});
}
}
Теперь вы можете просто передать массив отложенных / обещаний и вернуть массив разрешенных / отвергнутых объектов в ваш обратный вызов, например:
$.when.all(deferreds).then(function(objects) {
console.log("Resolved objects:", objects);
});
Очень хакерское решение, но оно работает. Я зацикливаю строки данных и использую addLabelOnlyMarkers
с центроидом многоугольника строк, используя st_centroid
. Я запускаю функцию pal
на каждой итерации.
for(i in 1:nrow(nc2)) {
text_col = pal(nc2$NAME[i])
p <- p %>%
addLabelOnlyMarkers(data = st_centroid(nc2[i,]),
label = ~NAME,
labelOptions = labelOptions(
noHide = T, textOnly = T,
style = list('color' = text_col)
)
)
}
Я все еще приветствую любое лучшее решение этого ...