2017-01-01 15 views
-1

INodeJS는 비동기 기능이 필요

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()가 값을 반환하기 전에 undefined를 반환합니다. recogn() 및 parse() 함수를 파일에 복사/붙여 넣으면 코드가 동 기적으로 실행되고 어떤 문제도 발생하지 않습니다. 그러나 나는 다른 파일에서 파일을 재사용 할 때 이러한 기능을 별도의 파일에 보관하려고합니다.

utils의 기능을 동기화해야한다고 지정하는 방법이 있습니까? 나는 asynch를 synch로 변환하는 라이브러리가 있다는 것을 알고 있지만, 나는 그것을 도와 줄 수있는 라이브러리를 거의 사용하지 않는 것을 선호한다. 나는 인식 함수가 Promise를 반환하게하려고했지만, 뒤죽박죽 된 엉망으로 끝났다.

편집 : 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

어, 좋아. 내 변수 이름에 대해 약간 자의식을 느낄 수는 없지만 느낄 수는 없습니다. – JsKingBoo

+1

구문 분석은 완벽하게 동기식 인 것처럼 보입니다. 나는 그것이 왜 갑자기 나타날지 모르지만 다른 모듈에 있기 때문에 비동기가됩니다. 뭔가 다른 것이 코드에 있습니다. –

답변

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]; 

} 

내 솔루션은 인식 기능의 외부 levenshtein 기능을 이동, 그래서 내가 원한다면 내가 다른 함수에서 user949300 및 @Robert Moskal @

을 levenshtein 호출 할 수 있습니다 , forEach 루프를 let ... in 루프로 변경했습니다. 기능 차이는 없지만 (코드에서 알 수 있듯이) 코드는 더 깨끗해 보입니다.

@ 토마스, 나는 let output = db[output]; 문제를 고쳤습니다.

귀하의 도움에 감사 드리며, 고맙습니다. 그리고 새해 복 많이 받으세요