2016-08-16 5 views
0

私が達成しようとしているかの簡単な概要:AJAXコールが(「app.js」に)サーバー上の特定のURLへ 高速ルーティングと非同期コード - 非同期コードの結果を送信するにはどうすればよいですか?

  • Expressのルートを作っている

    1. その後、ノードを実行します 「Send.js」
    2. 「Send.js」の出力内の.jsコードが「res.send」方法とAJAX要求に対する応答として使用されます。

    私の問題は、「Send.jsは」非同期メソッドを使用するということですので、場合の応答、私は「res.send(応答)」に戻すようにしようとしています「応答」変数が定義されていません非同期コードが行う前に、 "Send.js"内の "sendOn"関数が完了するので、自然に送信されます。

    コールバックを使用すると解決策が得られる可能性があるので、レスポンスが定義されるまで「res.send(response)」が呼び出されないように、私はそれを実装する方法を知らない(簡体字)

    app.js:ここに二つの別々のファイル

    var send = require("./Files/Other/Send.js"); 
    
    
        app.post('/Lamp-On', function (req, res) 
        { 
         var response = send.sendOn(); 
         res.send(response); 
        }); 
    

    Send.js(簡体字):

    client.openとclient.sendEventは、コールバックなどを受け入れ、両方の非同期メソッドです最終的な引数であり、外部SDKの一部です。

    var sendMessage = function() 
    { 
        var data = "on"; 
        var message = new Message(data); 
        message.properties.add('Turn On'); 
        console.log('Sending message to turn the lamp: ' + message.getData()); 
        client.sendEvent(message, printResultFor('Message')); 
    }; 
    
    var connectCallback = function() { 
         if (err) { 
          console.error('Could not connect: ' + err.message); 
         } 
         else { 
    
          console.log('Client connected'); 
    
          client.on('message', function (msg) { 
           console.log('Id: ' + msg.messageId + ' Body: ' + msg.data); 
           client.complete(msg, printResultFor('completed')); 
           // reject and abandon follow the same pattern. 
           // /!\ reject and abandon are not available with MQTT 
          }); 
    
          client.on('error', function (err) { 
           console.error(err.message); 
          }); 
    
          client.on('disconnect', function() { 
           clearInterval(sendInterval); 
           client.removeAllListeners(); 
           client.connect(connectCallback); 
          }); 
    
          // Now call the sendMessage function. 
           sendMessage(); 
         } 
    }; 
    
    var sendOn = function() { 
        client.open(connectCallback); 
        return 
    }; 
    
    // Helper function to print results in the console 
    function printResultFor(op) { 
        return function printResult(err, res) { 
         if (err !== null) { 
          console.log(op + ' error: ' + err.toString()); 
          console.log(err); 
         } 
         if (res) { 
          console.log(op + ' status: ' + res.constructor.name); 
         }; 
        }; 
    } 
    
    exports.sendOn = sendOn; 
    

    非常に多くの非同期コールバックを処理する方法はありません。

    最後の注意:私はどちらの提示も、誰もがちょうど私のためにこれを行うことを期待していますが、私は事前に、あなたは正しい方向に私を指すことができ感謝を願っています。

  • +0

    私の助言は、[Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise)を使用して非同期呼び出しを処理することです。 –

    +0

    'async'モジュールを使用してこの問題を回避することをお勧めします。' https://github.com()/caolan/async' – abdulbarik

    答えて

    1

    唯一の方法は、コールバックを経由しています。これはあなたが約束をしても真実です。

    コールバックは値を返す方法です。したがって、sendOn()は値を返す必要があるので、コールバックを受け入れる必要があります(代わりに約束を返し、約束はコールバックを受け入れます)。

    基本的にapp.jsは次のようになります。あなたが必要なものの

    app.post('/Lamp-On', function (req, res) 
    { 
        send.sendOn(function(err,response){ 
         res.send(response); 
        }); 
    }); 
    

    一つのサブルーチンとして機能するのである停止する考え方に慣れます。代わりに、forまたはwhileまたはifのような機能を制御構造と考えてください。今、興味深い部分が来る

    doIf(something,function(){ 
        something_else(); 
    }); 
    

    :あなたが持つ多くの問題を持つべきではありません

    if (something) { 
        something_else(); 
    } 
    

    概念的:あなたのようなコードを書くことに慣れています。 sendOn()はコールバックを受け入れますか?そのコールバックを関数に返すだけで、結果を返すことができます。基本的には、プロセスは値のすべての方法の代わりにすべての方法の外のコードに値を返すのでは、コードを渡す、手続き型プログラミングから反転している:

    var sendOn = function (callback) { 
        client.open(function(){ 
         connectCallback(callback); // pass the CODE down to the value 
        }); 
    }; 
    
    var connectCallback = function (callback) { 
        if (err) { 
         callback(err); 
        } 
        else { 
         client.on('message', function (msg) { 
          console.log('Id: ' + msg.messageId + ' Body: ' + msg.data); 
    
          callback(null, msg.data); // Now pass the value to the CODE 
         }); 
    
         sendMessage(); 
        } 
    }; 
    

    私はmsg.dataが結果であると仮定しています。それに応じてそれを変更しない場合。 sendOn()から下に通したコールバックに結果を渡すようにしてください。

    +0

    それは素晴らしいです、簡単に説明してくれてありがとう! – Sam3000

    1

    私の視点と私はちょうどそれは単にあなたがあなたのsendMessage関数(可能であれば)内のresオブジェクトでやりたいものは何でも追加することで動作するはずです何日か前に学んだから。 beeing javascriptのために、resオブジェクトはそこからアクセス可能でなければなりません。さらに、コールバックのヒントとcallbackhellについては

    :値を返すためにhttp://callbackhell.com/

    +0

    リンクありがとうございました – Sam3000

    関連する問題