gpt4 book ai didi

javascript - 在 sagas 中使用回调函数

转载 作者:行者123 更新时间:2023-12-03 03:39:02 26 4
gpt4 key购买 nike

好吧,我刚刚花了一天时间研究如何在传奇中使用回调函数。 (请客气一点,我刚刚学习这个传奇故事)

我最初的问题:我从服务器获得 xml 响应,在进入我的 reducer 之前,我想将其解析为 js 对象。因此我使用xml2js .

调用此 xml2js 库可使用回调:

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

在阅读了大量有关 eventChannels 的内容后,我提出了这个解决方案:

我的 channel 功能:<​​/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 函数仍然同步执行。因此,当我到达 yield 线时,解析已经完成,我可以永远等待,因为不会再发生任何事情。

有效的方法是通过替换来异步解析

parseString(input, (err, result) => {...}

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

所以基本上我正在使一个已经阻塞的函数解除阻塞,只是为了再次阻塞(产生)它,然后等待它完成。

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

最佳答案

为什么不直接使用cps效果呢?

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

关于javascript - 在 sagas 中使用回调函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45717896/

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