有没有可能以这样一种方式来解决一个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)中通过所有三个参数的内容?

这个问题的重要部分是,我是否可以将多个参数directly传递给链中的执行器.所以,像这样的策略有点绕过了这个问题:

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

也就是说,我正在寻找一种方法,让.then((a, b, c) => /* code */)这样的东西在一个链条中运行.

我try 了一些挥手的方法,但毫无疑问,这些方法不起作用,例如 case 1:

  • resolve(2,4,6)导致:2未定义未定义,因为resolve只接受一个参数.
  • resolve((2,4,6))将导致:6 undefined undefined,因为该值是逗号表达式.
  • resolve([2,4,6])个结果:[2,4,6]未定义未定义,如预期.
  • resolve({2,4,6})语法错误

我只是在使用标准promise ,无论 node 附带什么.js v16.13.1(我认为这是ES6?).

推荐答案

不,Promises规范只定义了first参数.你不能把它传给别人,你只能通过解构或传播来模仿它.

Promises/A+ spec, 2.2.2.1人中,我强调:

如果onFulfilled是一个函数:

  • 它必须在promise完成后调用,with 100’s value as its first argument.

ES6规范在NewPromiseReactionJob (27.2.2.1) step 1.e中描述了这一点:

e、 否则,让handlerResult完成(HostCallJobCallback(handlerundefined,«argument»)).

在这两种情况下,规格都允许a single Promise handler value.与setTimeout where additional arguments can be passed to the handler等功能不同,promise 没有这样的选项.

至少可以避免用spread syntax重复参数列表:

Promise.resolve()
    .then(providesThreeValues)
    .then(threeValues => takesThreeParameters(...threeValues))
    .then(console.log);

同样,如果您愿意编辑函数,则编辑到takesThreeParameters的次数可以最小,为array destructuring:

function takesThreeParameters ([a, b, c]) {  // new brackets
    console.log(`${a} ${b} ${c}`);
    return 'something';
}

Javascript相关问答推荐

类型错误:tasks.map不是函数(MERN堆栈)

使用CDO时如何将Vue组件存储在html之外?

橡皮擦完全让画布变成白色

使用AJX发送表单后,$_Post看起来为空

Chart.js V4切换图表中的每个条,同时每个条下有不同的标签.怎么做?

MongoDB中的引用

Chrome是否忽略WebAuthentication userVerification设置?""

Spring boot JSON解析错误:意外字符错误

Angular 17—每当一个布尔变量变为真时触发循环轮询,只要它保持为真

在Vite React库中添加子模块路径

colored颜色 检测JS,平均图像 colored颜色 检测JS

如何添加绘图条形图图例单击角形事件

如何从html元素创建树 struct ?

在react JS中映射数组对象的嵌套数据

无法读取未定义错误的属性路径名''

如何控制Reaction路由加载器中的错误状态?

使用Java脚本导入gltf场景并创建边界框

更新Redux存储中的对象数组

使每个<;li>;元素的 colored颜色 与随机生成的 colored颜色 列表不同(不重复

无法设置RazorPay订阅API项目价格