И html2canvas, и setCenter являются асинхронными. Таким образом, ваш код должен «подождать», пока один вызов не будет завершен, а затем продолжить работу.
Это может выглядеть примерно так
<input type="button" value="startCut" onclick="moveMap()">
и
var i = 0, n = 3;
function moveMap()
{
google.maps.event.addListenerOnce(map, 'idle', function() {
printMap();
})
map.setCenter({lat: map.getCenter().lat() - 0.1, lng: map.getCenter().lng() - 0.1});
}
function printMap()
{
html2canvas(document.getElementById("map"),
{
useCORS: true,
onrendered: function(canvas)
{
document.body.appendChild(canvas);
document.body.appendChild(document.createElement("br"))
i++;
if (i < n) {
moveMap();
} else {
google.maps.event.clearListeners(map, 'idle');
}
}
})
}
Проблема в этом случае в том, что карта иногда простаивает, но плитки все еще загружаются (обратите внимание на последнее изображение). Так что было бы лучше использовать тайм-аут.
var i = 0, n = 3;
function moveMap()
{
map.setCenter({lat: map.getCenter().lat() - 0.1, lng: map.getCenter().lng() - 0.1});
setTimeout(function() {
printMap();
}, 200);
}
function printMap()
{
html2canvas(document.getElementById("map"),
{
useCORS: true,
onrendered: function(canvas)
{
document.body.appendChild(canvas);
document.body.appendChild(document.createElement("br"))
i++;
if (i < n) {
moveMap();
}
}
})
}