Javascript 如何将Ramda管道函数与承诺和静态回调结合使用?

Javascript 如何将Ramda管道函数与承诺和静态回调结合使用?,javascript,bluebird,ramda.js,Javascript,Bluebird,Ramda.js,基于,我已经能够创建一个函数来解析初始数据对象的静态回调和基于承诺的回调 现在我希望能够通过一系列回调来传递这个数据对象,但是一旦我在混合中添加了多个承诺,就会遇到麻烦 当前设置 //图书馆 常数R=需要('ramda'); const fetch=require('node-fetch'); const Promise=require(‘蓝鸟’); //输入 常数数据={ 数组:['#','FirstName','LastName'],['1','tim','foo'],['2','kim',

基于,我已经能够创建一个函数来解析初始数据对象的静态回调和基于承诺的回调

现在我希望能够通过一系列回调来传递这个数据对象,但是一旦我在混合中添加了多个承诺,就会遇到麻烦

当前设置
//图书馆
常数R=需要('ramda');
const fetch=require('node-fetch');
const Promise=require(‘蓝鸟’);
//输入
常数数据={
数组:['#','FirstName','LastName'],['1','tim','foo'],['2','kim','bar'],
标题:“FirstName”,
更多:“东西”,
上面写着:“这里”
};
//静态和承诺解析器(带辅助函数)
const transposeObj=(obj,len=Object.values(obj)[0]。长度)=>
[…数组(len)].map(((uu,i)=>Object.entries(obj).reduce((a[k,v])=>({…a[k]:v[i]}),{});
const mergeCallback=async({array:[headers,…rows],header,…rest},callback)=>{
const index=R.indexOf(头,头);
const result=wait Promise.map(行,行=>{
返回回调(行[索引]);
})
.then(x=>({changes:x.map(v=>transposeObj(v.changes))}))
。然后({changes})=>({
所有标题:R.flatten([
…标题,
R.chain(t=>R.chain(Object.keys,t),[…更改])
.filter(k=>!headers.includes(k))
.filter((x,i,a)=>a.indexOf(x)==i)
]),
变化
}))
.然后({changes,allHeaders})=>({
结果:R.chain(
(行,i=R.indexOf(行,[…行])=>
更改[i]。映射(更改=>
对象。条目(更改)。减少(
(r[k,v])=>[…r.slice(0,allHeaders.indexOf(k)),v,…r.slice(allHeaders.indexOf(k)+1)],
行。切片(0)
)
),
[…行]
),
所有标题
}))
.then({resultRows,allHeaders,array})=>({
数组:[AllHeader,…resultRows],
标题,
休息
}));
返回结果;
};
//示例回调及其服务
常量adapterPromise1=异步名称=>{
const response=等待获取(`https://api.abalin.net/get/getdate?name=${name}&calendar=us`);
返回{
变化:{
nameday:R.Pull('day',response.results),
namemonth:R.Pull('month',response.results)
}
};
};
const servicePromise1=input=>mergeCallback(input,adapterPromise1);
常量adapterPromise2=异步名称=>{
const response=等待获取(`https://api.genderize.io?name=${name}`),然后(res=>res.json());
返回{
变化:{
性别:R.of(回应:性别)
}
};
};
const servicePromise2=input=>mergeCallback(input,adapterPromise2);
const adapterStatic1=name=>({changes:{NameLength:R.of(R.length(name))});
const servicestic1=input=>mergeCallback(input,adapterStatic1);
管道尝试
const result=R.pipe(
服务承诺书1,
服务承诺书2,
服务统计1
)(数据);

//控制台日志(结果) 拉姆达的
管道
不知道承诺。旧的Promise-aware版本,
pipeP
正在被弃用,取而代之的是更通用的版本。您可以通过如下方式将其与承诺一起使用(很快将重命名为
R,然后
):

R.pipeWith(R.then[
//servicePromise1,//此处的CORS头有问题。
服务承诺书2,
服务统计1
])(数据)
.then(console.log)
出于某种原因,当我试图从Ramda的REPL或SO代码段运行它时,您的第一个API调用遇到了CORS问题,但是没有它,过程应该是清晰的

这可能足以解决您的问题。它适用于这个测试用例。但我看到了一个悬而未决的问题:所有版本的
pipe
都将上一次调用的结果传递给下一次调用。但是,您使用数据的属性来配置下一个回调将如何触发的内容,即
header
属性。因此,在整个管道中必须保持固定。如果所有调用都要使用
FirstName
属性,这很好,但我的印象是,它们需要自己的版本

但是,编写一个定制的管道函数,让您将其与回调函数一起传递是非常容易的。那么您的呼叫可能如下所示:

seq([
['FirstName',servicePromise2],
[“FirstName”,serviceStatic1]
])(数据)
.then(console.log)
你可以在这个片段中看到这个想法的一个有效版本:

//输入
常数数据={
数组:['#','FirstName','LastName'],['1','tim','foo'],['2','kim','bar'],
标题:“FirstName”,
更多:“东西”,
上面写着:“这里”
};
//静态和承诺解析器(带辅助函数)
const transposeObj=(obj,len=Object.values(obj)[0]。长度)=>
[…数组(len)].map(((uu,i)=>Object.entries(obj).reduce((a[k,v])=>({…a[k]:v[i]}),{});
const mergeCallback=async({array:[headers,…rows],header,…rest},callback)=>{
const index=R.indexOf(头,头);
const result=wait Promise.all(rows.map)(row=>{
返回回调(行[索引]);
}))
.then(x=>({changes:x.map(v=>transposeObj(v.changes))}))
。然后({changes})=>({
所有标题:R.flatten([
…标题,
R.chain(t=>R.chain(Object.keys,t),[…更改])
.filter(k=>!headers.includes(k))
.filter((x,i,a)=>a.indexOf(x)==i)
]),
变化
}))
.然后({changes,allHeaders})=>({
结果:R.chain(
(行,i=R.indexOf(行,[…行])=>
更改[i]。映射(更改=>
对象。条目(更改)。减少(
(r[k,v])=>[…r.slice(0,allHeaders.indexOf(k)),v,…r.slice(allHeaders.indexOf(k)+1)],
行。切片(0)
)
),
[…行]
),
所有标题
}))
.then({resultRows,allHeaders,array})=>({
数组:[AllHeader,…resultRows],
标题,
休息
}));
重新