gpt4 book ai didi

javascript - 干掉 JavaScript 中的 Promise

转载 作者:太空宇宙 更新时间:2023-11-04 02:57:09 27 4
gpt4 key购买 nike

我在 Node v6.3.0 中的 api 上运行以下代码,该 api 运行两个单独的 Promise,具体取决于 POST 请求中是否存在参数的条件。

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
}

我确信有一种方法可以干燥这段代码,以便两个条件中的第一个 promise 将用户传递给第二个 promise ,但我不知道如何实现。我应该使用生成器,还是有一种方法可以用我没有得到的 promise 来做到这一点?

最佳答案

由于两个分支之间唯一不同的部分是传递给 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
<小时/>

如果您需要访问 userdata 来发送响应(在伪代码中有点难以区分),那么您可以保留嵌套:

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

关于javascript - 干掉 JavaScript 中的 Promise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38649294/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com