写这个承诺链的更好方法

时间:2014-01-28 14:59:06

标签: javascript node.js q

我正在学习Node并且有一个函数可以递归目录并返回与模式匹配的文件的承诺。这工作得很好,但我希望能够同时处理任意类型的文件,我正在链接这样的函数:

findFiles(scriptLocation, '.type1.').then(function (type1Files) { 
    console.log('type1Files: ' + type1Files) 
    findFiles(scriptLocation, '.type2.').then(function (type2Files) {
        console.log('type2Files: ' + type2Files) 
        findFiles(scriptLocation, '.type3.').then(function (type3Files) {
            console.log('type3Files: ' + type3Files) 
        })
    })
})

但是当我添加更多类型时,它可能变得非常草率。我试过了

Q.all([
    findFiles(scriptLocation, '.type1.')
    , findFiles(scriptLocation, '.type2.')
    , findFiles(scriptLocation, '.type3.')
]).then(function(type1Files, type2Files, type3Files){
   // all files returned in the first parameter...
})

我喜欢第二个版本的语法,但它并没有完全符合我的要求,因为结果不会单独返回,而是汇总成一个结果。

我使用Q作为我的承诺库。

1 个答案:

答案 0 :(得分:1)

改为使用spread

Q.all([
    findFiles(scriptLocation, '.type1.')
    , findFiles(scriptLocation, '.type2.')
    , findFiles(scriptLocation, '.type3.')
]).spread(function(type1Files, type2Files, type3Files){
   // ...
})

来自DOCs

  

如果您对数组有承诺,则可以使用spread代替数组。扩展函数将值“扩展”到履行处理程序的参数上。拒绝处理程序将在第一次失败时被调用。也就是说,无论哪个收到的承诺失败,首先都会被拒绝处理程序处理。