是否可以用一个替换两个相反和不同的功能?

时间:2014-10-31 14:23:06

标签: javascript function optimization

我想优化和减少我的代码,以提高它的性能和正确性。有了下面这两个不同的功能,我可以使用Google Map Marker成功地在地图上向前和向后移动pathIndex,在GPS坐标数组上计算[我之前没有包含这部分代码我认为它没有与这个问题相提并论,但如果需要,我可以并将发布它。

这是我的代码:

第一个功能

function animate() {
    if (pathIndex < coord.length && mapAnimationStatus != PLAY_PAUSED) {
        googleMapsMarker.setPosition(coord[pathIndex]);
        googleMap.panTo(coord[pathIndex]);

        pathIndex += 1;

        if (pathIndex == coord.length) {
            pause();

            pathIndex = 0;
            mapAnimationStatus = NOT_PLAY;

            return;
        }

        timerHandler = setTimeout("animate(" + pathIndex + ")", 1000);
    }
}

第二个功能

function animateRewind() {
    if (pathIndex >= 0 && mapAnimationStatus != PLAY_PAUSED) {
        googleMap.panTo(coord[pathIndex]);
        googleMapsMarker.setPosition(coord[pathIndex]);

        if (pathIndex == 0) {
            pause();

            mapAnimationStatus = NOT_PLAY;

            return;
        }

        pathIndex -= 1;

        timerHandler = setTimeout("animateRewind(" + pathIndex + ")", 1000);
    }
}

正如你所看到的那样,这两个函数共享了很多部分代码,并且认为可以用一个代码替换它们,但我无法弄清楚如何执行此操作。

那么,是否可以创建一个function来管理这两种不同的动画?

2 个答案:

答案 0 :(得分:0)

我希望我没有错过任何东西......

function animate(pathIndex, dir) {
    var animateDir = (pathIndex < coord.length
        && mapAnimationStatus != PLAY_PAUSED && dir == 'f')
            ? dir
            : (pathIndex >= 0
            && mapAnimationStatus != PLAY_PAUSED && dir == 'r')
            ? dir : "error";

    if (animateDir === "r") { googleMap.panTo(coord[pathIndex]); }
    if (animateDir !== 'error') { googleMapsMarker.setPosition(coord[pathIndex]); }
    if (animateDir === "f") {
        googleMap.panTo(coord[pathIndex]);
        pathIndex += 1;
    }

    if (animateDir !== 'error') {
        if (pathIndex == coord.length || pathIndex == 0) {
            pause();
            pathIndex = animateDir === "f" ? 0 : pathIndex;
            mapAnimationStatus = NOT_PLAY;
            return;
        }
        pathIndex = animateDir === "f" ? pathIndex - 1 : pathIndex;
        timerHandler = setTimeout("animate(" + pathIndex + "," + animateDir + ")", 1000);
    }
}

答案 1 :(得分:-1)

你可以试试这个:

function ConcatenateFunctions() {
    if(mapAnimationStatus != PLAY_PAUSED){
        googleMap.panTo(coord[pathIndex]);
        googleMapsMarker.setPosition(coord[pathIndex]);

        if (pathIndex < coord.length) {
            pathIndex += 1;
            if (pathIndex == coord.length) {
                pause();
                pathIndex = 0;
                mapAnimationStatus = NOT_PLAY;
                return;
            }
        }else if (pathIndex >= 0) {
            if (pathIndex == 0) {
                pause();
                mapAnimationStatus = NOT_PLAY;
                return;
            }
            pathIndex -= 1;
        }

        timerHandler = setTimeout("ConcatenateFunctions(" + pathIndex + ")", 1000);
    }
}

希望它会有所帮助!