2017-12-30 44 views
0

私が書いているテストで約束を使う方法を理解しようとしています。私はブラウザでプレーンオールネイティブの約束を使用しています。応答コールバック時の約束の使用

server.onresponse = function(data){ 
    //do stuff with data 
} 
:(まだ)何のライブラリ

テストでは、私はそうのようにコールバックを登録するサーバーオブジェクトを持っている私は、コールバック

を介してサーバの応答を取得し、サーバーとの非同期通信を必要としません

このテストでは、サーバーの応答に基づいて変更される一連のコマンドをサーバーに送信する必要があります。私はサーバーにコマンドを送信します。

server.sendCommand({data:"do something"}) 

このコマンドに基づいて、サーバーはonresponseコールバックを発生させます。私は次のコマンドが何であるべきかを決定するためにサーバーが送信したデータを読む必要があります。

相互作用が

  • sendコマンド1のようになり、コールバック
  • 送信コマンド2 onresponseから
  • プロセスデータを待って、コールバックonresponseから
  • プロセスデータを待つべき

私は、このやりとりを少しだけ明確にするために約束を使用したいと思います。一連の.then()のようなもの。

私は約束が再利用できないことを実感しているので、私はonresponseコールバックが発生するたびに同じ約束をリセットすることはできません。

約束でこれを行う方法はありますか?私はジェネレータも読み始めました。それらも助けてくれますか?

おかげ

+1

何[ 'Events'](https://developer.mozilla.org/en-US/docs/Web/Guide/Events/Creating_and_triggering_events)を使用してはどうですか? – Adriani6

+0

イベントはどのように役立ちますか? –

+0

はい、このAPIはあなたの仕事には役に立ちません。なぜ、 'sendCommand'は、グローバルな' onresponse'コールバックを発行するのではなく、応答の約束を返しますか? – Bergi

答えて

1

あなたはこのようなものかもしれない:

function sendCommand(data) { 
    return new Promise(function(resolve,reject) { 
     server.onresponse = resolve; 
     server.sendCommand(data); 
    }); 
} 

をし、このようにそれを使用します。

sendCommand({data:"do something"}) 
.then(function(data) { 
    console.log(data); 
    return sendCommand({data:"do something else "}) 
}) 
.then(function(data) { 
    console.log(data); 
}) 
0

あなたが説明しただけで何を行うにヘルパー関数を書くことができます。コマンドを渡すと、サーバーからの応答で解決するPromiseが返されます。何らかのエラー処理コールバックがある場合は、同様にそれを使用する必要があります。たとえば、server.onerrorとします。適切なハンドラが何であれ、これを置き換える必要があります。

function sendCommand(cmd) { 
    const promise = new Promise((resolve, reject) => { 
    server.onresponse = resolve; 
    server.onerror = reject; 
    }); 
    server.sendCommand(cmd); 
    return promise; 
} 

これは、説明したように、約束しているチェーンと同じです。もちろん、次のコマンドを起動するのではなく、応答で何かをしたいと思うでしょう。そして、最後にエラーが発生した場合は、catchと入力してください。

sendCommand({data: "do thing 1"}) 
    .then((response) => sendCommand({data: "do thing 2"})) 
    .then((response) => sendCommand({data: "do thing 3"})) 
    .then((response) => console.log("All done!")) 
    .catch((error) => console.log("Oops!")); 
関連する問題