我是when.js
javascript库的新手,但我熟悉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
- 框架我缺少的东西。我做得不对,对吧?
答案 0 :(得分:3)
由于doFilter
会返回一个承诺,我们可以
filters.doFilter('filter1name', reqAndPosts)
.then(function(filter1) {
return filters.doFilter('filter2name', filter1);
})
.then(function(filter2) {
return filters.doFilter('filter3name', filter2);
})
.then(renderView);
答案 1 :(得分: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);
答案 2 :(得分:1)
稍作思考,您可以编写一个通用实用程序函数,它将起始对象和过滤器序列作为其参数,动态构建所需的.then
链,并返回多重过滤结果的承诺。
该功能将如下所示......
function doFilters(filterArray, startObj) {
return filterArray.reduce(function(promise, f) {
return promise.then(function(result) {
return filters.doFilter(f, result);
});
}, when(startObj));
}
......这是对#34; The Collection Kerfuffle"
中标题here给出的模式的改编。对于您想要的操作,请致电如下:
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
的方法来整理。这将是最好的。