약속, 노드, 지루함, Azure SQL.맙소사!
하루가 끝날 때 몇 줄의 코드만 필요하지만, 이 두 줄의 코드를 발견하는 과정은 상당히 길고, 때로는 사람을 낙담하게 할 수도 있다.어느 곳에서도 이 점을 어떻게 정확하게 하는지 명확한 성명이 없다.나는 이것이 네가 약속을 장악하면 아주 뚜렷해지기 때문이라고 생각한다...만약 네가 아직 이 점에 도달하지 못했다면, 너는 어둠 속에 남았을 것이다.
그렇다면 공유지식서의 빈틈, 즉 인터넷을 복구해 보자!
무미건조한 용법을 개괄하다
같은 코드를 반복해서 작성하는 것을 피하기 위해서, SQL 명령을 실행하는 업무 논리를 함수에 봉인하기를 원할 수도 있습니다.이론적으로 말하면, 아래와 같다.
executeSQL = function(query, params) {
var result = null;
const conn = new Connection(...);
conn.on('connect', err => { ... invoke req ... });
const req = new Request(query, err => { return result });
req.addParameter(...params...);
req.on('rows', columns => { ... build result ... });
conn.connect();
}
connect()
방법을 성공적으로 호출하면 연결 이벤트가 발생합니다.그곳에서 창설을 실행할 수 있습니다 Request
.요청은 Azure SQL에서 결과를 가져오고 이를 처리하여 선택한 변수에 저장할 수 있는 row
이벤트를 생성합니다.현재의 도전은 어떻게 결과 집합을 가진 변수를 호출자에게 되돌려 줍니까?
뭐라고 쓰세요.
queryResult = executeSQL(...)
executeSQL
함수의 내용이 비동기적으로 실행되기 때문에, 작업이 이루어지지 않습니다.이것은 함수체에 return result;
를 추가하더라도 함수가 끝날 때까지 유일하게 queryResult
변수에 저장될 수 있다는 것을 의미한다.아무것도 아니에요.만약 사실이라면 return
문장은 실질적으로 리셋을 실행하지만, 이때 result
변수는 비어 있을 것이다. 왜냐하면 Azure SQL이 이렇게 빨리 결과를 되돌릴 수 없기 때문이다.Azure SQL은 밀리초 이내에 데이터를 쉽게 반환할 수 있지만, 이 경우 네트워크 왕복 시간은 이뿐만이 아닙니다.그래서 우리가 해야 할 일은 변수
result
가 사용할 때만 변수와 그 내용을 사용할 수 있도록 확보하는 것이다.이것이 바로 약속의 작용이다."약속은 일반적으로 최종 사용 가능한 가치의 에이전트로 정의됩니다."
약속 패키지 만들기
이 점을 감안하면, 우리는 고전 함수가 아닌 재사용 가능한 방법을 약속으로 포장해야 한다는 것이 분명하다.코드는 다음과 같습니다.
const executeSQL = (query, params) => new Promise(
(resolve, reject) => {
...function body...
}
이것은 매우 간단하다, 그렇지?우리는 지금 두 개의 리콜을 방문할 수 있다resolve
: 모든 것이 예상대로 진행되고 결과가 호출자가 처리할 때 어떤 일을 할 준비가 되어 있음reject
: 어떤 물건이 작용하지 않고 결과가 사용할 수 없을 때.const req = new Request(query, (err) => {
if (err) {
reject(err);
} else {
resolve(result);
}
});
우리는 result
변수를 안전하게 사용할 수 있다는 것을 알고 있다. 이 변수는 row
이벤트 처리 프로그램에 채워져 있다. 예를 들어 Tedious doc assure us "요청이 완료되었을 때 리셋을 호출할 수 있다. 성공하든 오류가 있든. 문장이 실행되는 동안 오류가 발생하면err는 오류를 설명할 것이다."약속을 이행해라, 루크!
기왕 우리가 승낙한 바에야 그것을 쓰자.
코드의 어느 곳에서, 우리는
executeSQL
함수를 호출하고, 결과를 우리가 선택한 변수에 넣기를 희망합니다.이런 걸 쓰는 게 아니라,const result = executeSQL(query, params);
우리는 이렇게 해야 한다.executeSQL(query, params)
.then(ok => {
...process result here...
})
.catch(err => {
...handle errors here...
});
then
코드 블록에서 ok
변수의 결과를 사용할 수 있습니다.됐어, 완성했어!이제 모든 것이 순조롭게 진행될 것이다.
결론
나는 정말 이 문장이 이 도전을 영원히 명확하게 해결하는 데 도움이 되기를 바란다.나는 바로 이런 문장이 내 생활에서 많은 시간을 절약할 수 있기를 매우 바란다.이제 나는 약속에 대해 잘 이해했다. 그리고, 그렇다. 지금은 모든 것이 자질구레하지만, 이 점에 도달하는 것은 고통스러운 여정이다.코딩은 고통이 아니라 즐거움이어야 한다!낙담하는 것도 괜찮고, 때로는 도움이 되지만, 나는 이것이 너무 심하다고 생각한다.자, 이제 형세가 바뀌었습니다. 이 글은 게임에 즐거움을 주기 위해서입니다!
다음까지 즐겁게 놀아요.
기다리다소스 코드를 원합니다!
물론, 원본 코드!여기는: Todo Backend Implementation with Azure Functions, Node and Azure SQL, 더 구체적으로 말하면 본고에서 기술한 코드는here이다.
연습으로 저는 Todo MVC app규범에 따라 Todo Backend API완전한 작업의 백엔드 API를 실현했습니다.나는 모든 것이 레고 블록처럼 완벽하게 결합된 것을 좋아한다.
사진 작성자Castorly Stock 출처Pexels
Reference
이 문제에 관하여(약속, 노드, 지루함, Azure SQL.맙소사!), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/azure/promises-node-tedious-azure-sql-oh-my-ho1텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)