rxjs中的动态计时器

时间:2017-06-04 06:47:02

标签: javascript arrays rxjs rxjs5

我正在创建一个包含图片和视频的滑块,我希望为每种类型分配一定的屏幕时间。

static void Main(String[] args) {
    string s = "nmmaddammhelloollehdertr";
    long ans = Manacher(s, s.Length);
    Console.WriteLine(ans);
}
static long Manacher(string s, int N) {
    int i, j, k, rp;
    int[,] R = new int[2, N + 1];
    // rp is the palindrome radius
    // R is a table for storing results (2 rows for even and odd length palindromes)

    // store the maximum length of the palindromes from left and from right here
    int[] MaxFromLeft = new int[N];
    int[] MaxFromRight = new int[N];
    for (i = 0; i < N; i++) {
        MaxFromLeft[i] = 1;
        MaxFromRight[i] = 1;
    }

    // insert guards to iterate easily 
    // without having to check going out of index range
    s = "@" + s + "#";

    for (j = 0; j <= 1; j++) {
        R[j, 0] = rp = 0; i = 1;
        while (i <= N) {
            while (s[i - rp - 1] == s[i + j + rp]) rp++;
            R[j, i] = rp;
            k = 1;
            while ((R[j, i - k] != rp - k) && (k < rp)) {
                R[j, i + k] = Math.Min(R[j, i - k], rp - k);
                k++;
            }
            rp = Math.Max(rp - k, 0);
            i += k;
        }
    }

    s = s.Substring(1, N);

    int len     // length of the palindrome
        , st    // start index
        , end;  // end index;
    for (i = 1; i <= N; i++) {
        for (j = 0; j <= 1; j++)
            for (rp = R[j, i]; rp > 0; rp--) {
                len = 2 * rp + j;
                st = i - rp - 1;
                end = st + len - 1;
                // update the maximum length
                MaxFromRight[st] = Math.Max(MaxFromRight[st], len);
                MaxFromLeft[end] = Math.Max(MaxFromLeft[end], len);
            }
    }

    // get the accumulative maximums 
    // to avoid doing a second loop inside
    for (i = N - 2, j = 1; i > 1; i--, j++) {
        MaxFromRight[i] = Math.Max(MaxFromRight[i], MaxFromRight[i + 1]);
        MaxFromLeft[j] = Math.Max(MaxFromLeft[j], MaxFromLeft[j - 1]);
    }

    long ans = 0;
    for (i = 0; i < N - 1; i++) {
        ans = Math.Max(ans, MaxFromLeft[i] * MaxFromRight[i + 1]);
    }
    return ans;
}

我可以使用上面的代码为所有幻灯片设置通用时间,但无法为数组中的每个项目设置单独的值。

这是我真正想要实现的目标 1)一旦完成无限迭代,迭代数组从0到最后一个索引 2)能够根据每个对象内的type属性设置下一次迭代的时间。

现在只有1)是可以接受的。

2 个答案:

答案 0 :(得分:1)

诀窍是使用concatMap。它将从每个项目创建一个直接可观察的项目,然后延迟一个空的Observable。在那个延迟之后,observable完成,下一个将被连接。这将使用repeat()运算符无限重复。

let data =  [{"path":"http://localhost:8091/public/testimg.jpg","type":"image"},{"path":"http://localhost:8091/public/testvideo.mp4","type":"video"}];

const delayByMediaType = {image: 1000, video: 5000};

Observable.from(data)
    .concatMap(media => 
        Observable.of(media).concat(Observable.empty().delay(delayByMediaType[media.type]))
    )
    .repeat()
    .do(console.log)
    .subscribe(item => this.activeItem = item);

答案 1 :(得分:0)

let data =  [{"path":"http://localhost:8091/public/testimg.jpg","type":"image"},{ "path":"http://localhost:8091/public/testvideo.mp4","type":"video"}];

const delayByMediaType = {image: 1000, video: 5000};

Observable.from(data)
.concatMap(media => {
   return Observable.of(media).delay(delayByMediaType[media.type])
}).subscribe(console.log);