使R.pipe兑现承诺吗?

烈火凤凰

背景

我有一个简单的代码,其中包含要打印的功能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的情况下使此代码起作用?

在这里可以找到MWE

谢谢

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

如何在不将所有内容转换为Promise的情况下使此代码起作用?

通过一切,你的意思是这部分?

// ...
phrase();

出于同样的原因,三元运算符会?:强制您同时包含条件,异步调用的两个分支,期望您同时处理Promise / Task / Future的成功分支错误分支

// ...
phrase().then(onSuccess, onError);

当然,没有什么可以阻止您

const main = () =>
  phrase().then(console.log, console.error)

main()

而且,如raina77ow所述不建议使用pipeP(和composeP)我们可以通过添加一个简单的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>

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章