2017-05-29 13 views
3

私はnodeJSで私の最初のアプリケーションを書いています。私は電報のボットを書いています。私はそれが非同期の性質を持っているので、アプリケーションの流れをどのように制御するのかと思っていました。私は、すべてがシンプルで手続き的なPHPバックグラウンドから来ています。NodeJSでのアプリケーションの流れを制御する方法

私のボットでは、メッセージが受信されると、先に進む前にまずプログラムがユーザーの詳細がキャッシュまたはデータベースにあることを確認する必要があります。チェックが終わったら、それを進めることができます。

私はフラグの変数を使ってこれを行うつもりでしたが、javascriptの非同期性のためにできません。私はこのことをどうやってやるのか分かりません。オブジェクトにリスナーを割り当て、フローを制御するイベントを発行しますか?ここで

が私のコードである

const fs = require('fs'); 

// Establish connection with cache and database 
const mysql = require('mysql-wrapper'); 
const Memcached = require('memcached'); 
const memcached = new Memcached('localhost:11211'); 
const bb = require('bot-brother'); 

var settings = { 
    host: 'localhost', 
    database: 'test', 
    user: 'root', 
}; 
var qb = require('node-querybuilder').QueryBuilder(settings, 'mysql', 'single'); 

//Load the database cache functions 
const dbc = require("./dbc"); 
dbc.memcached = memcached; 
dbc.mysqc = qb; 

//Load the user handling functions 
const user = require("./user"); 
user.dbc = dbc; 

const bot = bb({ 
    key : '331263599:AAHmLl4Zcg4sKGnz7GNzacgkJl1W8lwz33c', 
    polling: { interval: 0, timeout: 1 } 
}); 

//code that checks user existence in cache/db 
bot.api.on('message', (msg)=>{ 
    console.log(msg.from); 
    var userData = msg.from; 
    var tid = userData.id; 
    //Check if user is in cache 
    user.check_user_existence(tid,function(re){ 
     if(re < 2){ 
      user.complete_user_existence(re,userData,function(err,response){ 
       if(err){ 
        bot.api.sendMessage(tid,"Sorry an unexpected error occured!"); 
       } else { 
        console.log('ha'); 
        play = 1; 
       } 
      }); 
     } 

    }); 
}); 


//Code to be run after checking 
if(play==1){ 
    send_another_message(); 
    do_some_things(); 
} 
+0

node.js(または一般的なJavaScript)でasync/awaitと約束をどのようにするかを見てみたいかもしれません。 ここで少し紹介します: https://blog.readme.io/using-async-await-in-node-js-7-6-0/ – LongHike

+0

素晴らしいライン、 '私はすべてがあったPHPのバックグラウンドから来ましたシンプルで、手続き的で、順番に、それを愛しています。 – anwerj

答えて

0

あなたには、いくつかの非同期機能をシリアル化が必要な場合は、あなたがこれのいずれかを使用することができます

あなたがコールバックまたはあなたが非同期モジュールを使用することができます 約束やミューテックスを使用することができますがアプローチ:

Callback

Native promises

第二の機能が第1機能.bluebirdが約束を作成し、その上に完全なカスタマイズを有するためのモジュールである必要がほとんど関連の機能のために使用

Bluebird promise

Async module

コールバックと約束。

非同期モジュールは、非同期の関数を実行し、それらの結果を一緒に得るための良い方法です。あなたは、単一のオブジェクトで非同期の書き込みがあったか、ファイル場合

最後の方法は、あなたがあなたがnsynjs経由で同期コードを実行することができますロック解除のアプローチ

-1

が必要ミューテックスです。 nsynjs対応のラッパーへのコールバックと

ステップ1.ラップ遅い機能:

// content of wrappers.js 
user = require("./user"); 
exports.user_check_user_existence_wrapper = function (ctx, uid) { 
    var res = {}; 

    user.check_user_existence(tid,function(re){ 
     res.re = re; 
     ctx.resume(); 
    }) 

    return res; 
}; 
exports.user_check_user_existence_wrapper.nsynjsHasCallback = true; 

exports.user_complete_user_existence_wrapper = function(ctx, re, userData) { 
    var res = {}; 

    user.complete_user_existence(tid,function(error,ue_response){ 
     res.error = error; 
     res.ue_response = ue_response; 
     ctx.resume(error); // if error is set, it will cause exception in the caller 
    }) 

    return res; 
}; 
exports.user_complete_user_existence_wrapper.nsynjsHasCallback = true; 

ステップ2.遅い機能を実行するために、上からラッパーを使用し、機能にあなたの同期ロジックを入れて、あなたのコードは次のように変換することができます:

var synchronousCode = function(wrappers,msg) { 
    console.log(msg.from); 
    var userData = msg.from; 
    var tid = userData.id; 
    //Check if user is in cache 
    var re = wrappers.user_check_user_existence_wrapper(nsynjsCtx,tid).re; 
    if(re < 2) 
     try { 
      var res = wrappers.user_complete_user_existence_wrapper(re,userData).ue_response; 
      console.log('ha'); 
      play = 1; 
     } 
     catch (e) { 
      bot.api.sendMessage(tid,"Sorry an unexpected error occured!",e); 
     }; 
} 

ステップ3. nsynjs経由で同期機能を実行します。

var nsynjs = require('nsynjs'); 
var wrappers = require('./wrappers'); 
var synchronousCode = function(wrappers,msg) { 
.... 
} 

bot.api.on('message', function(msg) { 
    nsynjs.run(synchronousCode,{},wrappers,msg,function(){ 
     console.log('synchronousCode finished'); 
    }) 
}); 

もっと多くの例をご覧ください:https://github.com/amaksr/nsynjs/tree/master/examples/node-module-loading

関連する問題