Node.js 和 Q Promises:如何以更简洁的方式传递参数?

Node.js and Q Promises: How can I hand over parameters in a cleaner way?

我有一些这样的代码:

function example(data){
    asyncFnOne()
        .all([asyncFnTwo(), data])
        .spread(asyncFnThree)
        .done();
};

这些函数的作用并不重要。我遇到的问题是我不知道 asyncFnThree 如何从 asyncFnTwo 和函数参数访问数据。我解决问题的方式不是很可读。是否有推荐的方法以干净的方式执行此操作?

第二个可能的想法是

function example(data){
    asyncFnOne()
        .then(asyncFnTwo)
        .then(function(result){
            asyncFnThree(result, data);
        })
        .done();
    };
};

但我觉得可读性更差

您可以使用变量作为缓冲区或创建一些 "middle-man" 承诺。你可以在这里找到一些很好的例子:http://pouchdb.com/2015/05/18/we-have-a-problem-with-promises.html?utm_source=javascriptweekly&utm_medium=email

要以所需的方式使用 Q.all,您必须执行以下操作:

function example(data) {
    return Q.all[
        asyncFnOne().then(asyncFnTwo),
        data
    ]).spread(asyncFnThree);
}

或者在链的第一部分使用变量,这样您就不必将所有内容都塞进一个表达式中,可以使用 return Q.all([promiseTwo, data])….

闭包的替代方法也完全没问题,而且相当标准。您不妨使用任何提供某种部分应用程序的库,并使用它代替函数表达式。

function example(data) {
    return asyncFnOne()
    .then(asyncFnTwo)
    .then(asyncFnThree.bind(null, data)); // argument order to asyncFnThree: data, result
}