2016-09-03 9 views
0

Express経由のノードを発見しました(使用していたMeteorではなく)。私は、非同期-物の種類によって追い詰めだと...データベースが読み込まれた後でのみ、(スイッチの)「ケース」を選択してください。

function isAuthorized(x) { 

     // Connect to database when Bq. receives a message 
     mongoClient.connect(process.env.MONGO, function (err, db) { 

      if (err) { 
       console.log('Unable to connect to the mongoDB server') 
      } else { 
       console.log('Connection established') 
       let Users = db.collection('users') 
       Users.find({_id: From}).toArray(function (err, result) { 
        if (err) { console.log(err) } 
        else if (result.length) { 
         console.log("found"); 
         // switch (true) { 
         //  case x == null && result.authorization == null : return true 
         //  break ; 
         //  case x == false && result.authorization == false : return true 
         //  break ; 
         //  case x == true && result.authorization == true : return true 
         //  break ; 
         //  default: return false 
         //} // end of switch() 
        } 
        else { 
         console.log("does not exist"); 
         if (x == 'unknown user') { console.log("return true"); return true } 
        } 
        db.close() 
       }) 
      } 
     }) 
    } // end of isAuthorized() 

(Mongoのコレクションを読み取るために)関数の下にこの関数は)(スイッチに呼ばれています。

switch (true) { 

     case isAuthorized('unknown user') : something 
     case XYZ 
     case ABC 
     Default: console.log("default") 
} 

問題がある: スイッチ()のisAuthorized()関数の終了前に火災。したがって、switch()はisAuthorized( 'unknown user')== trueの代わりにデフォルトのケースを起動します。関数がデータベースが読み込まれるのを待っているようではありません。

関数()の最後がswitch()を待つことができますか?

私はコールバックのことを聞いたことがありますが、非同期ですが、私はすべてのことを明確な順序で並べ替えることはできません。

ありがとうございました。

答えて

1

短い回答

コードは現在構造化されていますが、これは不可能です。 を参照してくださいasync & await

長い答え

すでに述べてきたように、あなたはコールバックを使用する必要があると思います。あなたの例では、ユーザーが最初に承認されているかどうかを確認してからswitch文を実行する必要があります。

擬似コード:

function isAuthorized(user, callback) { 

    // Run your mongoDB logic 
    mongoClient.connect(process.env.MONGO, function (err, db) { 
     Users.find({ _id: From }).toArray(function (err, result) { 
      var authorized = ...check if user is authorized... 
      db.close(); 
      callback(authorized); 
     }); 
    }); 
} 

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

isAuthorized(yourUser, function (authorized) { 
    if (authorized) { 
     // business logic 
    } 
}); 

私はこれがあなたのためにいくつかの物事をクリア願っています。

+0

ありがとうございました。しかし、私は「約束」を使って別の方向に行きました。私のスイッチを実行する前に実行する必要のある機能は 'promise(resolve、reject)'であり、私のスイッチは 'promise.all(...)の中にあります。それが有効な働き方であるかどうかを知る... – nerotulip

関連する問題