首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当我没有返回值时,将回调转换为承诺

当我没有返回值时,将回调转换为承诺
EN

Stack Overflow用户
提问于 2017-07-31 06:50:15
回答 2查看 503关注 0票数 0

我正在处理使用hapi并执行node-rules规则的服务器。

我有一个回调,由R.execute方法从node-rules调用。作为执行Promise的结果,我需要从exec方法返回一个callback

代码语言:javascript
复制
const callback = data => {
  const {matchPath, result} = data
  descision.setMatchPath(matchPath)
  if (!result) {
    descision.addMessage(
      'No match could be found in the rules provided, either incorrect or non-matching information was provided'
    )
  }
}

function exec (input) {
  const {medicineType, facts: data} = input
  const R = new RuleEngine()
  R.register(rules)
  if (medicineType !== 'generic') {
    const facts = {
      data
    }
    R.execute(facts, callback)
  }
}

我从源代码中注意到,R.execute不返回任何我可以使用的内容。我注意到在execute中递归地调用这个功能在这里,但是在没有回调的情况下不会终止。

如何将其转换为返回承诺的函数?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-07-31 08:11:39

在浏览其他问题的一些答案时,我想起了$.deferredQ.defer API,找到了一个类似于它们的解决方案:

  1. 创建延迟的
  2. 将延迟传递给回调。
  3. 使用deferred并解决承诺
  4. 最重要的是,返回由promise创建的deferred

我不想要一个自定义承诺实现或猴子补丁的Promise API。如果后者不是一个问题,那么在npm上有几个模块可以做到这一点,并且可以实现多填充Promise.defer

defer函数是从这里开始

代码现在看起来如下:

代码语言:javascript
复制
/* eslint-disable promise/param-names */
function defer () {
  let resolve, reject
  const promise = new Promise(function (...args) {
    resolve = args[0]
    reject = args[1]
  })
  return {resolve, reject, promise}
}

/* eslint-enable promise/param-names */

const makeCallback = deferred => data => {
  const {matchPath, result} = data
  descision.setMatchPath(matchPath)
  if (!result) {
    descision.addMessage(
      'No match could be found in the rules provided, either incorrect or non-matching information was provided'
    )
  }
  deferred.resolve(descision)
}

function exec (input) {
  const {medicineType, facts: data} = input
  const R = new RuleEngine()
  R.register(rules)
  if (lenderType !== 'generic') {
    const facts = {
      data
    }
    const deferred = defer()
    const callback = makeCallback(deferred)
    R.execute(facts, callback)
    return deferred.promise
  }
}
票数 0
EN

Stack Overflow用户

发布于 2017-07-31 07:08:44

不确定我是否理解正确,但这样的事情可能会发生

代码语言:javascript
复制
function exec(input) {
    const { medicineType, facts: data } = input
    const R = new RuleEngine()
    R.register(rules)

    return new Promise(function(resolve, reject) {
        if (medicineType !== 'generic') {
            const facts = {
                data
            }
            R.execute(facts, function(data) {
                const { matchPath, result } = data
                descision.setMatchPath(matchPath)
                if (!result) {
                    descision.addMessage(
                        'No match could be found in the rules provided, either incorrect or non-matching information was provided'
                    )
                }
                resolve('<return here whatever you want>')
                // or
                // reject('<return some error>')
            });
        } else {
            reject('<return some error>')
        }
    })
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45409130

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档