我正在重写一些使用sync ajax构建的遗留代码(非常糟糕)。现在我使用Promises(特别是Bluebird)。在很多情况下,函数有很多路径,只有一个是异步的。
问题是我必须识别所有路径并手动从每个路径返回新的承诺。像这样:
function syncFn() {
// sync code return
}
function asyncFn() {
// some async code here that return Promise
}
function myMegaFunction() {
if ( ... ) {
return Promise.resolve(syncFn());
}
else if ( ... ) {
if ( ... ) {
return Promise.resolve(syncFn());
}
else if ( ... ) {
return Promise.resolve(syncFn());
}
else {
return asyncFn(); // only async function here
}
}
else {
return Promise.resolve();
}
}
是否有某种方法或模式可以简化这一点?也许是这样的 - 如果返回undefined,那么换成空的承诺?
答案 0 :(得分:2)
简单
function myMegaFunction() {
if ( ... ) {
syncFn();
}
else if ( ... ) {
if ( ... ) {
syncFn();
}
else if ( ... ) {
syncFn();
}
else {
return asyncFn(); // only async function here
}
}
return Promise.resolve();
}
不是很多......但更简单
当你在一个需要完成的地方返回asyncFn时,你可以简单地返回一个Promise.resolve()......实际上......让我编辑一下,我只是注意到了......
function myMegaFunction() {
if ( ... ) { //A
;
}
else if ( ... ) { //B
if ( ... ) { //C
;
}
else if ( ... ) { // D
;
}
else {
return asyncFn(); // only async function here
}
}
synchFn();
return Promise.resolve();
}
可以写成
function myMegaFunction() {
if(!A && B && !C && !D) {
return asyncFn();
}
synchFn();
return Promise.resolve();
}
编辑::不完全 - 但是关闭 - 那个synchFn是一个婊子
function myMegaFunction() {
if(!A && B && !C && !D) {
return asyncFn();
}
if(A || B) {
synchFn();
}
return Promise.resolve();
}
答案 1 :(得分:1)
您可以使用Promise.method
帮助程序:
var myMegaFunction = Promise.method(function myMegaFunction() {
// return values
// throw errors
// return promises
});
...而myMegaFunction(…)
将始终返回承诺。它会自动捕获异常,并将函数的结果包装在Promise.resolve(…)
。