gpt4 book ai didi

javascript - 使用可读的函数名称扁平化 promise 链

转载 作者:行者123 更新时间:2023-11-29 10:05:45 24 4
gpt4 key购买 nike

我在 Handling multiple catches in promise chain 中看到了 promise 实现这产生了一个非常可读的链

return validateInput
.then(checkLoginPermission)
.then(checkDisableUser)
.then(changePassword);

但是,为了做到这一点,每个函数都需要返回一个值而不是 Promise?由于 Promise 可以解析为值或 Promise,所以这不是问题。我的目标是让每个函数都具有可读的清晰逻辑。

尝试展开嵌套的 promise 函数时出现问题

return validateInput
.then(function(resultA) {
return checkLoginPermission
.then (function(resultB) {
// Do something with resultA
})
});

想象一下原始实现涉及访问先前 promise 的值。有了嵌套的 promise ,它很容易实现。但是对于展平链,我需要像这样分解每个函数

function validateInput = function (resultA ) {
return Promise.resolve({resultA : resultA, resultB :
}
function checkLoginPermission = function (mix ) {
let resultA = mix.resultA;
let resultB = mix.resultB
//Do something with resultA
...
}

当链中的最后一个函数从一开始就依赖某些东西时,情况会更糟。这意味着即使未使用该值,也必须从链的开头向下传递。

那么我是否不小心踩到了某种可能影响性能的反模式?没有所有这些麻烦,我还能如何实现良好的可读性?

最佳答案

这实际上是 asyncawait 的用武之地。当您需要跨多个异步调用/ promise 的结果在范围内时,这很好。如果你可以使用它,我会说尝试一下。

async function foo () {
const input = await validateInput()
const hasPermission = await checkLoginPermission(input)
const result = await checkDisableUser(hasPermission)
return await changePassword(result)
}

只需将变量传递给需要的函数即可。只是在那里展示一个例子。我也有点不确定您如何设置 validateInput,我认为您需要将 await 放在函数调用本身的前面。

如果您不能使用 async/await,我通常会使用您的第二个代码片段,或者在顶部定义更高范围的变量:

let resultA
return validateInput
.then(function(result) {
resultA = result
return checkLoginPermission
.then (function(resultB) {
// Do something with resultA
})
});

关于javascript - 使用可读的函数名称扁平化 promise 链,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43723662/

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