0

我是when.jsjavascript 库的新手,但我熟悉 C# 中的异步编程。这就是为什么我觉得这段代码很笨拙:

filters.doFilter('filter1name', reqAndPosts).then(function(filter1) {
    filters.doFilter('filter2name', filter1).then(function(filter2) {
        filters.doFilter('filter3name', filter2).then(function (posts) {
            renderView(posts); 
        });
    });
    return filter1;
});

我基本上希望按顺序调用三个方法,每个方法的输出都通过管道传送到下一个方法。无论如何我可以将这段代码重构为更“类似序列” - 即摆脱嵌套?我觉得这里的when-framework 缺少一些东西。我做的不对,对吧?

4

3 回答 3

3

由于doFilter返回一个承诺,我们可以做

filters.doFilter('filter1name', reqAndPosts)
    .then(function(filter1) {
        return filters.doFilter('filter2name', filter1);
    })
    .then(function(filter2) {
        return filters.doFilter('filter3name', filter2);
    })
    .then(renderView);
于 2014-05-06T07:02:10.817 回答
3

还有另一种选择可以同时具有更清晰的缩进和以前的结果的优点:使用withThis.

filters.doFilter('filter1name', reqAndPosts).withThis({}).then(function(filter1) {
    this.filter1 = filter1; // since we used withThis, you use `this` to store values
    return filters.doFilter('filter2name', filter1);
}).then(function(filter2) {
    // use "this.filter1" if you want
    return filters.doFilter('filter3name', filter2);
}).then(renderView);
于 2014-05-06T08:25:57.480 回答
1

稍加思考,您就可以编写一个通用的实用函数,它将一个起始对象和一个过滤器序列作为其参数,动态构建所需的.then链,并返回多重过滤结果的承诺。

该功能将如下所示...

function doFilters(filterArray, startObj) {
    return filterArray.reduce(function(promise, f) {
        return promise.then(function(result) {
            return filters.doFilter(f, result);
        });
    }, when(startObj));
}

...这是对“The Collection Kerfuffle”一节中给出的模式的改编。

对于您想要的操作,请按以下方式调用:

doFilters(['filter1name', 'filter2name', 'filter3name'], reqAndPosts).then(function(result) {
    //All filtering is complete.
    //Do awesome stuff with the result.
});

证明它没有被破坏并且在范围内,doFilters()将仍然可以在您的代码中的其他地方使用:

doFilters(['f1', 'f2', 'f3'], myOtherObject).then(function(result) {
    //...
});

doFilters()只需稍加努力,您就可以通过措辞作为一种方法来整理事情filters。那将是最好的。

于 2014-05-06T11:10:00.170 回答