好的,所以我花了一天时间搞清楚如何在传奇中使用回调功能。 (请好,我只是在学习这个传奇故事)
我最初的问题: 我从服务器获得了一个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) => {...}
所以基本上我已经将一个已经阻塞的函数解锁,只是为了再次阻塞(屈服)它然后等待它完成。
我的问题现在非常简单:是否有更聪明的方法?
答案 0 :(得分:0)
为什么不使用cps
效果?
try {
const result = yield cps(parseString, input)
} catch (err) {
// deal with error
}