2017-01-29 2 views
0

JavaScript를 처음 사용하여 다음과 같은 작업을하려고합니다. 목록을 반복하고 목록의 항목에 종속적 인 데이터베이스 호출을 만들고 싶습니다. 분명히 호출이 비동기 적이기 때문에 for 루프가 끝날 때까지 호출이 반환되지 않으므로 목록이 비어 있습니다.비동기 호출을 사용하여 for 루프에 배열을 작성하십시오.

C#에서는 데이터베이스 호출을 기다릴 수 있으며 정상적으로 작동합니다. 나는 자바 스크립트 유사한 접근 방법을 찾기 위해 노력했습니다,하지만 난 많은 행운

exports.methodName = (req, res) => { 

    var itemsToReturn = [] 

    for (let item of list) { 
     db.all(sql), (err, rows) => { 
      itemsToReturn.push(rows) 
     } 
    } 

    res.json(itemsToReturn) 
} 

내가 자바 스크립트에서이가 될 것이다 어떻게 내 데이터베이스

답변

1

같이 현대적인 방법을 SQLite는 사용하고를 가지고 있지 않다 사용하는 또는 db.all()에 대한 약속 인터페이스 (표시 콜백 인터페이스 대신)을 만들고 모든 비동기 작업이 완료되면 약속 배열에 Promise.all()을 사용하십시오. 데이터베이스가 무엇인지 말할 필요가 없으므로 데이터베이스에 이미 약속 인터페이스가 있는지 여부에 대한 도움을 드릴 수는 없습니다.

여기 list 가정 일을하는 수동 방식으로 배열되어있다 :

exports.methodName = (req, res) => { 

    let itemsToReturn = []; 
    let cntr = 0; 
    for (let [index, item] of list.entries()) { 
     db.all(sql), (err, rows) => { 
      if (err) { 
       // insert error handling here 
      } else { 
       itemsToReturn[index] = rows; 
       ++cntr; 
       if (cntr === list.length) { 
        res.json(itemsToReturn); 
       } 
      } 
     } 
    } 
} 

당신이 db.allPromise()라는 데이터베이스에 대한 약속 인터페이스를 가지고 가정, 당신이 뭔가를 할 수 있습니다 :

exports.methodName = (req, res) => { 

    Promise.all(list.map(item => { 
     return db.all(someSql); 
    })).then(results => { 
     res.json(results); 
    }).catch(err => { 
     res.sendStatus(500); 
    }); 
} 
+0

감사 :) 이것에 대해 설명해 드리겠습니다. – Ralt

+0

@Ralt - 여러 비동기 작업을 관리하는보다 현대적인 방법 인 약속이 어떻게 작동하는지 예제를 추가했습니다. – jfriend00

+0

@Ralt - SQLite의 일부 버전처럼 보입니다. db.all()은 이미 두 번째 구현을 사용할 수 있도록 약속을 반환합니다. – jfriend00

관련 문제