javascript - 解决对多个参数值的 promise

是否有可能以链中的下一个 promise 可以是采用多个参数的执行器的方式解决 promise ?

例如,假设我有一个接受三个参数的函数:

function takesThreeParameters (a, b, c) {
    console.log(`${a} ${b} ${c}`);
    return 'something';
}

如果我将它包含在链中,例如其中之一:

// case 1: in a new Promise
new Promise((resolve, reject) => resolve( /* ??? */ ))
    .then(takesThreeParameters)
    .then(console.log);

// case 2: in the middle of a chain somewhere
Promise.resolve()
    .then(() => /* ??? */)
    .then(takesThreeParameters)
    .then(console.log);

// case 3: in the middle of a chain, but not as a function expression
function providesThreeValues () {
    return /* ??? */;
}
Promise.resolve()
    .then(providesThreeValues)
    .then(takesThreeParameters)
    .then(console.log);

在那些情况下(或至少在其中一种情况下)我可以返回一些东西(代替 /* ??? */),它将在 中传递所有三个参数.then(takesThreeParameters)?

这个问题的重要部分是我是否可以将多个参数直接传递给链中的执行程序。因此,类似这些的策略可以绕过这个问题:

  • 修改takesThreeParameters以获取单个参数
  • 用字典解决之前的 promise ,然后将其解包(例如 abc => takesThreeParameters(abc.a, abc.b, abc.c))
  • 相同,但使用数组等。(abc => takesThreeParameters(abc[0], abc[1], abc[2]))

即我正在寻找一种方法来使 .then((a, b, c) =>/* code */) 在链中工作。

我尝试了一些手摇的东西,不出所料,它们没有用,例如对于案例 1:

  • resolve(2,4,6) 结果:2 undefined undefined,因为 resolve 只需要一个参数。
  • resolve((2,4,6)) 结果:6 undefined undefined,因为值为逗号表达式。
  • resolve([2,4,6]) 结果:[2,4,6] undefined undefined,正如预期的那样。
  • resolve({2,4,6})语法错误

我只是使用标准的 promise ,无论 Node.js v16.13.1(我认为是 ES6?)附带的任何东西。

最佳答案

Promiseresolve 回调只会接受第一个参数,所以如果你想传递多个值你需要传递一个数组,然后你可以读取这些值通过解构作为单独的参数:

const takesThreeParameters = ([a, b, c]) => console.log(`a:${a} b:${b} c:${c}`)

const p = new Promise(res => setTimeout(res([1, 2, 3]), 2000))
p.then(takesThreeParameters)

编辑:根据@Naor Tedgi 的回答,如果您想避免修改现有函数,可以将它们包装到一个 HOF 中:

const wrap = (cb) => (args) => cb(...args)
const takesThreeParameters = (a, b, c) => console.log(`a:${a} b:${b} c:${c}`)
const wrappedFn = wrap(takesThreeParameters)

const p = new Promise(res => setTimeout(res([1, 2, 3]), 2000))
p.then(wrappedFn)

https://stackoverflow.com/questions/71886910/

相关文章:

r - 将嵌套列表中的名称分配给它的子组件

haskell - 为什么类型为 [tail, init, reverse], [[a] -> [a

html - 一个 SVG 的多个路径的多个复选框

javascript - 检查两个数组是否有一个具有相同属性的对象

reactjs - antd DatePicker 或 RangePicker 如何让日历图标左对齐

python - 正确完成所有操作后出现 Ngrok 错误 6022

c++ - 检查是否存在嵌套类型别名并有条件地设置类型别名

python - 谷歌云 SDK : Python was not found

javascript - Nuxt中如何使用动态图片?

go - 用类型参数替换接口(interface)参数有什么好处?