我可以解决这个问题吗?当'承诺调用?

时间:2014-05-06 06:58:58

标签: javascript asynchronous promise when-js

我是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 - 框架我缺少的东西。我做得不对,对吧?

3 个答案:

答案 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的方法来整理。这将是最好的。