是否有可能以链中的下一个 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
以获取单个参数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?)附带的任何东西。
最佳答案
Promise
的resolve
回调只会接受第一个参数,所以如果你想传递多个值你需要传递一个数组,然后你可以读取这些值通过解构作为单独的参数:
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/