JS Promises - 当只有一个路径是异步时,if-else 流
JS Promises - if-else flow when only single path is async
我正在重写一些遗留代码,这些代码是使用同步 ajax 构建的(太糟糕了)。现在我正在使用 Promises(特别是 Bluebird)。有很多情况,函数有很多路径,只有一个是异步的。
问题是我必须识别所有路径并手动 return 每个路径的新承诺。像这样:
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();
}
}
有什么方法或模式可以简化这个吗?也许是这样的 - 如果 return 未定义,则包装为空承诺?
更简单
function myMegaFunction() {
if ( ... ) {
syncFn();
}
else if ( ... ) {
if ( ... ) {
syncFn();
}
else if ( ... ) {
syncFn();
}
else {
return asyncFn(); // only async function here
}
}
return Promise.resolve();
}
不是很多...但更简单
当你在需要完成的地方 returning asyncFn 时,你可以简单地放一个 return 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();
}
您可以为此使用 Promise.method
助手:
var myMegaFunction = Promise.method(function myMegaFunction() {
// return values
// throw errors
// return promises
});
……myMegaFunction(…)
将永远是 return 一个承诺。它会自动捕获异常,并将函数的结果包装在 Promise.resolve(…)
.
中
我正在重写一些遗留代码,这些代码是使用同步 ajax 构建的(太糟糕了)。现在我正在使用 Promises(特别是 Bluebird)。有很多情况,函数有很多路径,只有一个是异步的。
问题是我必须识别所有路径并手动 return 每个路径的新承诺。像这样:
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();
}
}
有什么方法或模式可以简化这个吗?也许是这样的 - 如果 return 未定义,则包装为空承诺?
更简单
function myMegaFunction() {
if ( ... ) {
syncFn();
}
else if ( ... ) {
if ( ... ) {
syncFn();
}
else if ( ... ) {
syncFn();
}
else {
return asyncFn(); // only async function here
}
}
return Promise.resolve();
}
不是很多...但更简单
当你在需要完成的地方 returning asyncFn 时,你可以简单地放一个 return 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();
}
您可以为此使用 Promise.method
助手:
var myMegaFunction = Promise.method(function myMegaFunction() {
// return values
// throw errors
// return promises
});
……myMegaFunction(…)
将永远是 return 一个承诺。它会自动捕获异常,并将函数的结果包装在 Promise.resolve(…)
.