2017-08-16 4 views
0

これで、サガ内でコールバック関数を使用する方法を理解しました。サガ内でのコールバック関数の使用

私の最初の問題: 私はサーバからxml応答を受け取り、私の減速機に入る前に、私は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について多くを読んだ後、私はこのソリューションを作ってみた:

マイチャンネル-機能:

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) 

私が今直面している問題は、明らかにcallback-structureを使用している間でさえ、parseString-functionがまだ実行されていることです。synchronously。だから私が私の利回りに行くと、解析はすでに終わってしまって、もう何も起こらないので、私は永遠に待つことができます。

何の作業は、再びそこで、基本的

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

私はちょうど(歩留まり)をブロックするためにブロック解除すでに遮断する機能を作ってるんだそれで

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

を交換することにより、非同期的に解析を行うことですそれが完了するのを待つ。

私の質問は非常にシンプルです。スマートな方法がありますか?

答えて

0

なぜcps効果を使用するだけではありませんか?

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

ありがとう、これは私が探していたものです! :-) –

関連する問題