Promise.resolve-6ren">
gpt4 book ai didi

javascript - 让 R.pipe 与 Promise 一起工作?

转载 作者:行者123 更新时间:2023-12-01 16:11:01 24 4
gpt4 key购买 nike

背景

我有一个简单的代码组成打印函数 Hello Mars! :

var greeting = () => "Hello ";
var dbQuery = str => Promise.resolve( `${str} Mars` );

var phrase = R.pipeP(
greeting,
dbQuery,
R.flip( R.concat )("!")
);

phrase();

问题

我正在使用 pipeP因为 dbQuery返回一个 promise 。我的印象是 pipeP如果我将整个代码转换为 Promise 可以工作,但是 我真的很想避免 .

我的想法是类似于 flatMap ,又名 chain在 Ramda 中,但这也不起作用。

问题

如何在不将所有内容都转换为 Promise 的情况下使此代码正常工作?

A MWE can be found here

最佳答案

一旦你处理了 Promise/Task/Future,就不可避免地不得不处理异步数据和程序流

How can I make this code work without converting everything into a Promise?



一切,你的意思是这部分吗?
// ...
phrase();

出于同样的原因,三元运算符 ?:强制您包含条件的两个分支,异步调用期望您处理 Promise/Task/Future 的成功和错误分支
// ...
phrase().then(onSuccess, onError);

当然没有什么能阻止你做
const main = () =>
phrase().then(console.log, console.error)

main()

而作为 raina77ow提到,pipeP(和 composeP)是 not recommended .我们可以通过添加一个简单的 then 来修复您的程序很容易插入到普通 pipe 中的函数(或 compose )函数序列

const greeting = () => "Hello ";
const dbQuery = str => Promise.resolve( `${str} Mars` );

const then = R.curry((f, p) => p.then(f))

const phrase = R.pipe(
greeting,
dbQuery,
then(R.flip(R.concat)('!'))
);

phrase().then(console.log, console.error);
// Hello Mars!
// => { Promise 'Hello Mars!' }
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.js"></script>

关于javascript - 让 R.pipe 与 Promise 一起工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48169989/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com