2016-10-26 3 views
0

문자열의 일부 텍스트를 pg-promise을 사용하는 데이터베이스의 값으로 대체하고 싶습니다. 전에 Promise을 사용하지 않았으므로 최선의 방법으로 처리하는 방법에 어려움을 겪고 있습니다. 나는 동기 및 비동기 프로그래밍을 결합하려고 나는이 작동하지 않습니다 지금까지 시도 무엇텍스트를 pg-promise의 데이터로 바꾸기

:

var uid = ...; 
"Some string".replace(/\#\{([\w]*?)\}/gmi, function(m, c) { 
    var r = ""; 
    db.one("SELECT a FROM ... WHERE x = $1 AND y = $2", [c, uid]) 
     .then(function(data) { 
      r = data.a; 
     }); 
    return r; 
}); 

r는, 당연히, 빈 문자열입니다. 이 블록을 데이터베이스의 값을 "대기"하도록 다시 작성하는 방법이 있습니까?


내가하려는 것은 사용자에게 보내는 메시지의 자리 표시자를 바꾸는 것입니다. 그래서 위의 prepareMessage라는 함수의 일부이며 나는 그래서 이런 식으로 뭔가 보이는 Socket.IO에 사용하는 사용자에게 메시지를 보낼 : 일부 독서와 더 사고 후

io.to(socket.id).emit('message', { text: prepareMessage(msg) });

+0

논리가 바뀌 었습니다. 먼저 비동기 블록을 실행하고 데이터를 얻은 후에는 동기 부분을 수행하고 다른 방법은 수행하지 마십시오. –

+0

@ vitaly-t 나는 일반적인 생각을 이해하지만 실제로 그것을 내 문제로 해석 할 수는 없다. 의사 코드로 예제를 제공해 주시겠습니까? – neurotroph

답변

0

를, 내가 와서 다른 사람이 비슷한 문제가있는 경우 추가하고 싶은 솔루션을 사용하십시오.

(위의 질문에 대한뿐만 아니라, 나는 순서를 유지하는 것을 나의 메시지는 문자열의 배열이 추가 합병증이 있고.)

열쇠가 모든 쿼리를 보낼 tasks를 사용하는 것이 었습니다 DB를 하나의 패키지로 만들고 모든 결과가 반환되기를 기다립니다. 이로 인해 다음 코드가 생성되었습니다.

// Sample data 
var messages = ["String 1 with no placeholder.", 
"String 2, #{placeholder1}, String 2.2.", 
"String 3 with some more #{placeholder2}."]; 

// Collect all matches in array 
var matches = []; 
messages.forEach(function(text, index) { 
    const regex = /\#\{([\w]*?)\}/gmi; 
    var m; 
    do { 
    matches.push(regex.exec(text)) 
    } while(m); 
}); 

// Request data from the database 
db.task(function(t) { 
    return t.batch(matches.map(function(m) { 
    return t.oneOrNone("SELECT ... FROM ... WHERE id = $1", [m[1]]) 
    })); 
}) 
.then(function(r) { 
     // Replace all occurrences of placeholders 
     r.forEach(function(p) { 
      messages = messages.map(function(t) { return t.replace("#{"+p.id+"}", p.replacement); }); 
     }); 

     // Send message to user 
     io.emit('text', messages)M 
     }) 
.catch(function(e) { 
     // ... error handling ... 
     });