2017-01-01 9 views
-1

たかったされたときに、私は次のコードNodeJSは同期が

var utils = require(`${__dirname}/../../utils/utils.js`); 
... 
let object = utils.parse(input); 
    if (object === undefined){ 
     let helper = utils.recognize(input); 
     msg.channel.sendMessage("\"" + input + "\" not recognized. Did you mean \"" + helper[0] + "\"?"); 
     object = utils.parse(helper[0]); 
    } 
//code related to object 
console.log(object.strLength); 
「パース」は、データベース内のオブジェクトへの入力を一致させようと、「認識」ベストマッチを見つけようとする

を持って非同期機能を必要と入力が間違って綴られている場合(Levenshtein)(マッチの程度などの追加情報とともに)

現在のところ、コードは非同期で実行されるという問題があります。 "object.strLength"は、utils.recognize()が値を返す前に未定義を返します。認識()とパース()関数をファイルにコピー/ペーストすると、コードは同期的に実行され、問題は発生しません。しかし、私はむしろ別のファイルに再利用するので、これらの機能を別々のファイルに保存します。

utilsの機能を同期させる必要があることを指定する方法はありますか?私はasynchを同期に変換するライブラリがあることを知っていますが、私はそれを助けることができるライブラリをほとんど使用しません。私は認識機能にプロミスを返させようとしましたが、それは混乱した混乱として終わりました。

編集:here's parse。私は私が最初にそれが含まれていませんでした、この質問に答えるために必要だったとは思いませんでした:

var db = require(`${__dirname}/../data/database.js`); 
... 
var parse = (input) => { 
    let output = db[output]; 
    if (output === null) { 
     Object.keys(db).forEach((item) => { 
      if (db[item].num === parseInt(input) || (db[item].color + db[item].type === input)){ 
       output = db[item]; 
       return false; 
      } 
     });  
    } 
    return output; 
} 
+0

utils.parseのコードを表示する必要があります。 –

+0

ええ、ok。私の変数名では少し自己意識を感じることはできません。 – JsKingBoo

+1

parseは、完全に同期する方法のようです。私はなぜそれが突然になるかわかりません;別のモジュールに入っているからといって非同期になります。あなたのコードに何か他のものがあります。 –

答えて

0

私は、おかげでみんなが問題を解決しました。ここで間違っていたのは、それはrecogn()です。当初はコードを表示しないのは間違いでした。

オリジナル認識:

var recognize = (item) => { 

//iterate through our databases and get a best fit 
let bestItem = null; 
let bestScore = 99999; //arbitrary large number 
//let bestType = null; 

//found algorithm online by milot-mirdita 
var levenshtein = function(a, b) { 
    if (a.length == 0) { return b.length; } 
    if (b.length == 0) { return a.length; } 

    // swap to save some memory O(min(a,b)) instead of O(a) 
    if(a.length > b.length) { 
     let tmp = a; 
     a = b; 
     b = tmp; 
    } 

    let row = []; 
    for(let i = 0; i <= a.length; i++) { 
     row[i] = i; 
    } 

    for (let i = 1; i <= b.length; i++) { 
     let prev = i; 
     for (let j = 1; j <= a.length; j++) { 
      let val; 
      if (b.charAt(i-1) == a.charAt(j-1)) { 
       val = row[j-1]; // match 
      } else { 
       val = Math.min(row[j-1] + 1, // substitution 
         prev + 1,  // insertion 
         row[j] + 1); // deletion 
      } 
      row[j - 1] = prev; 
      prev = val; 
     } 
     row[a.length] = prev; 
    } 
    return row[a.length]; 
} 

//putting this here would make the code work 
//console.log("hi"); 

Object.keys(db).forEach((key) => { 
    if (levenshtein(item, key) < bestScore) { 
     bestItem = key; 
     bestScore = levenshtein(item, key); 
    } 
}); 

return [bestItem, bestScore]; 

} 

私のソリューションは、認識機能の外にレーベンシュタイン機能を移動することでしたので、私はしたい場合は、私は別の関数からuser949300と@Robert Moskal @

をレーベンシュタイン呼び出すことができます私はforEachループをlet ... inループに変更しました。機能上の違いはありませんが(私が知る限り)、コードはより洗練されています。

@トーマス、私はlet output = db[output];問題を修正しました。

ご協力いただきありがとうございます。お誕生日おめでとう。