Javascript 如何将强制性承诺转化为功能性任务?

Javascript 如何将强制性承诺转化为功能性任务?,javascript,asynchronous,ecmascript-6,functional-programming,Javascript,Asynchronous,Ecmascript 6,Functional Programming,我想以一种有原则的方式将命令性的承诺转换为功能性的任务: const记录=(类型,o)=> (o[type.name | | type]=type.name | | type,o); 常数thisify=f=>f({}); const taskFromPromise=p=> 任务((res,rej)=> p、 然后(res) .catch(x=>rej(`Error:${x}`)); const Task=Task=>record( 任务 thisify(o=>{ o、 任务=(res,rej

我想以一种有原则的方式将命令性的
承诺
转换为功能性的
任务

const记录=(类型,o)=>
(o[type.name | | type]=type.name | | type,o);
常数thisify=f=>f({});
const taskFromPromise=p=>
任务((res,rej)=>
p、 然后(res)
.catch(x=>rej(`Error:${x}`));
const Task=Task=>record(
任务
thisify(o=>{
o、 任务=(res,rej)=>
任务(x=>{
o、 任务=k=>k(x);
返回res(x);
},rej);
返回o;
}));
const tx=taskFromPromise(Promise.resolve(123)),
ty=taskFromPromise(Promise.reject(“reason”).catch(x=>x));
//^^^^^^避免未捕获错误所必需的
tx.task(console.log);//123

ty.task(console.log);//“reason”应该是“Error:reason”
您不需要
.catch(x=>x)
,这会将您被拒绝的承诺变成已解决的承诺。您不应该得到“未捕获错误”,因为在
taskFromPromise
函数中有一个
catch
。删除
.catch(x=>x)
确实有效,并将您置于
.catch(x=>rej(`Error:${x}')

但是,删除
.catch(x=>x)
会抛出“TypeError:rej不是函数”。从代码示例来看,您的
.task(…)
(在
tx.task(…)
ty.task(…)
中)似乎需要两个函数。如果承诺得到解决,则调用第一个,如果承诺被拒绝,则调用第二个。提供这两个函数会给我留下一个有效的代码段

const记录=(类型,o)=>
(o[type.name | | type]=type.name | | type,o);
常数thisify=f=>f({});
const taskFromPromise=p=>
任务((res,rej)=>
p、 然后(res)
.catch(x=>rej(`Error:${x}`));
const Task=Task=>record(
任务
thisify(o=>{
o、 task=(res,rej)=>//需要两个函数
任务(x=>{
o、 任务=k=>k(x);
返回res(x);
},rej);
返回o;
}));
const tx=taskFromPromise(Promise.resolve(123)),
ty=taskFromPromise(Promise.reject(“原因”);//已删除。catch(x=>x)
tx.task(console.log,console.log);//提供两个功能
任务(console.log,console.log);
//         ^            ^ 

//如果已解决,如果被拒绝
您的
任务
方法需要两个参数,但您只传递了一个参数。我不认为您的
任务
比承诺“更不必要”或“更有效”。如果你能在它们之间来回转换,它们在大多数情况下是相等的。预期的区别是什么?
Promise
立即调用传递的函数,而
Task
创建一种函数组合形式。两者都是根本不同的操作,我不会列出后果,因为您肯定知道它们。也许你认为
任务
是必须的,因为它会导致局部变异以实现共享。我还不确定多播是有害的还是可取的。答案可能取决于您是否需要取消。是的,您的
任务
只是一个具有延迟初始执行的
承诺
,而不是一个函数。正是这种突变和异步效果结果的共享,使它们成为必不可少的工具。(也就是说,你的共享被破坏了,因为它不会在承诺完成之前发生,也不会考虑拒绝)。运行<代码>任务<代码>是JavaScript的运行时。运行时没有RT,因为所有效果都已释放。不共享拒绝案例是一项设计决策。你的分享也被破坏了,因为它不会在承诺兑现之前发生——这是一种有偏见的说法<代码>任务s不是承诺。共享只适用于有限的用例。我真的对
Promise
s一无所知。我想如果没有直接连接的捕获处理程序,被拒绝的Promis会立即抛出。对不起,我问了个新手问题。