在传奇中使用回调函数

时间:2017-08-16 15:43:05

标签: javascript callback redux yield redux-saga

好的,所以我花了一天时间搞清楚如何在传奇中使用回调功能。 (请好,我只是在学习这个传奇故事)

我最初的问题: 我从服务器获得了一个xml响应,在进入我的reducer之前,我想把它解析成一个js-object。因此我使用xml2js

调用此xml2js库可以使用回调:

parseString(xmlInput, (err, jsResult) => {
  // here I'd like to put() my success-event, however that's not possible in this scope
})

在阅读了很多关于eventChannels之后,我想出了这个解决方案:

我的频道功能:<​​/ p>

function parseXMLAsyncronously (input) {
  return eventChannel(emitter => {
    parseString(input, (err, result) => {
      emitter(result)
      emitter(END)
    })
    return () => {
      emitter(END)
    }
  })
}

在传奇中使用它:

const parsedJSObject = yield call(parseXMLAsyncronously, xmlFromServer)
const result = yield take(parsedJSObject)

我现在遇到的问题是,即使在使用回调结构时,parseString-function仍然执行同步。因此,当我到达我的屈服线时,解析已经完成,我可以永远等待,因为不会再发生任何事情了。

通过替换

,异步进行解析是有效的
parseString(input, (err, result) => {...}

const parser = new Parser({async: true})
parser.parseString(input, (err, result) => {...}

所以基本上我已经将一个已经阻塞的函数解锁,只是为了再次阻塞(屈服)它然后等待它完成。

我的问题现在非常简单:是否有更聪明的方法?

1 个答案:

答案 0 :(得分:0)

为什么不使用cps效果?

try {
  const result = yield cps(parseString, input)
} catch (err) {
  // deal with error
}