用javascript干掉承诺
节点v6.3.0中的以下代码运行在一个api上,该api根据POST请求中是否存在参数的条件运行两个单独的承诺用javascript干掉承诺,javascript,node.js,promise,generator,Javascript,Node.js,Promise,Generator,节点v6.3.0中的以下代码运行在一个api上,该api根据POST请求中是否存在参数的条件运行两个单独的承诺 if (paramExists) { // call database with this query User.filter(/* do something with param */) .then(function (user) { Data.filter(/* same in both conditions */)
if (paramExists) {
// call database with this query
User.filter(/* do something with param */)
.then(function (user) {
Data.filter(/* same in both conditions */)
.then(function (data) {
// join data and user
res.send(joinedData);
}) // omit catch for clarity
}) // omit catch for clarity
} else {
// call database with this query
User.filter(/* do something with header */)
.then(function (user) {
Data.filter(/* same in both conditions */)
.then(function (data) {
// join data and user
res.send(joinedData);
}) // omit catch for clarity
}) // omit catch for clarity
}
我确信有一种方法可以使这段代码干涸,这样两种情况下的第一个承诺都会将用户传递给第二个承诺,但我不知道如何实现。我应该使用发电机,还是有一种方法可以实现我没有得到的承诺?你可以做如下事情。我假设
Data.filter
也会返回一个承诺
if (paramExists) {
// call database with this query
User.filter(/* do something with param */)
.then(sameCondition); // omit catch for clarity
} else {
// call database with this query
User.filter(/* do something with header */)
.then(sameCondition); // omit catch for clarity
}
function sameCondition(user) {
return Data.filter(/* same in both conditions */)
.then(function (data) {
// join data and user
res.send(joinedData);
}); // omit catch for clarity
}
你可以做如下的事情。我假设
Data.filter
也会返回一个承诺
if (paramExists) {
// call database with this query
User.filter(/* do something with param */)
.then(sameCondition); // omit catch for clarity
} else {
// call database with this query
User.filter(/* do something with header */)
.then(sameCondition); // omit catch for clarity
}
function sameCondition(user) {
return Data.filter(/* same in both conditions */)
.then(function (data) {
// join data and user
res.send(joinedData);
}); // omit catch for clarity
}
像这样做
var task1 = paramExists ?
User.filter(/* do something with param */) :
User.filter(/* do something with header */)
var doFilter = task1.then(function () {
return Data.filter(/* same in both conditions */)
})
doFilter.then(function (joinedData) {
res.send(joinedData);
});
像这样做
var task1 = paramExists ?
User.filter(/* do something with param */) :
User.filter(/* do something with header */)
var doFilter = task1.then(function () {
return Data.filter(/* same in both conditions */)
})
doFilter.then(function (joinedData) {
res.send(joinedData);
});
由于两个分支之间唯一不同的部分是传递给
User.filter()
,因此可以将该值放入条件中的局部变量中,然后使用该变量运行一个版本的代码
您还可以简化链接方法,以删除不必要的嵌套:
var arg;
if (paramExists) {
arg = ... // some logic
} else {
arg = ... // some different logic
}
// call database with this query
User.filter(arg).then(function (user) {
return Data.filter(...);
}).then(function (data) {
// join data and user
res.send(joinedData);
}); // omit catch for clarity
您也可以使用三元:
var arg = paramExists ? someLogic : someOtherLogic;
// call database with this query
User.filter(arg).then(function (user) {
return Data.filter(...);
}).then(function (data) {
// join data and user
res.send(joinedData);
}); // omit catch for clarity
如果您需要访问
用户
和数据
来发送响应(在伪代码中有点难说),那么您可以保留嵌套:
var arg = paramExists ? someLogic : someOtherLogic;
// call database with this query
User.filter(arg).then(function (user) {
return Data.filter(...).then(function(data) {
// join data and user
res.send(joinedData);
});
}); // omit catch for clarity
由于两个分支之间唯一不同的部分是传递给
User.filter()
,因此可以将该值放入条件中的局部变量中,然后使用该变量运行一个版本的代码
您还可以简化链接方法,以删除不必要的嵌套:
var arg;
if (paramExists) {
arg = ... // some logic
} else {
arg = ... // some different logic
}
// call database with this query
User.filter(arg).then(function (user) {
return Data.filter(...);
}).then(function (data) {
// join data and user
res.send(joinedData);
}); // omit catch for clarity
您也可以使用三元:
var arg = paramExists ? someLogic : someOtherLogic;
// call database with this query
User.filter(arg).then(function (user) {
return Data.filter(...);
}).then(function (data) {
// join data and user
res.send(joinedData);
}); // omit catch for clarity
如果您需要访问
用户
和数据
来发送响应(在伪代码中有点难说),那么您可以保留嵌套:
var arg = paramExists ? someLogic : someOtherLogic;
// call database with this query
User.filter(arg).then(function (user) {
return Data.filter(...).then(function(data) {
// join data and user
res.send(joinedData);
});
}); // omit catch for clarity
您可以更简单,只需根据条件向第一个承诺传递不同的参数,例如,
User.filter(paramExists?args1:args2)
看起来很简单,让我试试。您可以更简单,只需根据条件将不同的参数传递给第一个承诺,例如,User.filter(paramExists?args1:args2)。然后(restOfBehavior)代码>看起来很简单,让我试试。你考虑过承诺吗。所有的。它最终看起来像var p1=User.filter(paramExists?args1:args2),p2=Data.filter(…);所有([p1,p2])。然后(函数(用户,数据){…})
听起来像是你在要求什么?你考虑过承诺吗。它最终看起来像var p1=User.filter(paramExists?args1:args2),p2=Data.filter(…);所有([p1,p2])。然后(函数(用户,数据){…})代码>听起来像是你在要求?我想这可能是个问题,因为OP需要将第一个承诺的结果与第二个承诺的结果结合起来,并且使用链式回调方法返回的用户数据超出范围。@numbers131407-我在后面添加了该选项。有时很难在伪代码中说出这种详细程度。或者,他们也可以与其中一个共享同一级别的数据。事实上,第二个选项是有效的。谢谢你,学会热爱承诺。我认为这可能是个问题,因为OP需要将第一个承诺的结果与第二个承诺的结果结合起来,并且使用链式回调方法,返回的用户数据超出范围。@numbers131407-我在后面添加了该选项。有时很难在伪代码中说出这种详细程度。或者,他们也可以与其中一个共享同一级别的数据。事实上,第二个选项是有效的。谢谢你,学会爱承诺。