2017-12-02 8 views
1

항목 ID를 나타내는 문자열 배열이 주어진다면 문자열을 반복하고 데이터베이스에서 항목 개체를 당겨서 배열에 항목 개체를 추가하고 싶습니다. 내 데이터베이스에서 콜백 범위를 벗어난다.콜백 함수의 범위 밖에있는 배열 채우기

function getItemObjects(items, callback) { 
    let returnItems = []; 
    items.forEach((i) => { 
    Item.getItemById(i, (err, item) => { 
     if (err) { 
     console.log(err); 
     return; 
     } else { 
     returnItems.push(item); 
     } 
    }); 
    }); 
    callback(returnItems); 
} 

Item.getItemById()는 몽고 데이터베이스에서 개체를 가져옵니다 내 항목 모델 내에서 기능입니다. 해당 콜백 함수의 범위를 벗어나는 배열을 채우려면 어떻게해야합니까?

getItemObjects() 함수에서 콜백 값을 가져올 때 그 의미는 바로 그 값입니다. 그러나 for 루프 내에 값을 기록하면 제대로 채워집니다.

+1

그냥'콜백 (returnItems) 전에 returnItems''에서 무엇을 얻을 수 있습니까에 대한 자세한 내용을 찾을 수'실행? –

+0

그냥 빈 배열을 반환합니다. 내가 Item.getItemById() 콜백 함수의 범위 밖에서 참조 할 때마다 그것은 비어 있습니다. 그 함수를 떠날 때 다시 설정되는 것과 같습니다. – Darren

+1

약속 사용은 아이디어처럼 들리 -이 질문은 속임수라고 생각합니다. https://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-call – mplungjan

답변

1

약속을 사용하여 데이터베이스 콜백에서 값을 추출 할 수 있습니다.

이 시도 :

function getItemObjects(items, callback) { 
 
    const itemPromises = items.map((itemId) => { 
 
    return new Promise((resolve, reject) => { 
 
     Item.getItemById(itemId, (err, item) => { 
 
     if (err) { 
 
      reject(err); 
 
     } 
 
     resolve(item); 
 
     }); 
 
    }); 
 
    }); 
 

 
    Promise.all(itemPromises) 
 
    .then(results => callback(results)) 
 
    .catch(error => callback(error)); 
 

 
}

에주의를 여기에 다음 오류 (Promise.all에서) 전체 약속의 항목 결과 중 하나가 catch 블록 실패 할 경우 실행됩니다.

당신은 Promise.allPromise.catch

+0

감사합니다. 당신, 위대한 작품. 나는 항목을 .then 아래의 콜백에 인수로 추가해야했지만 이후에는 제대로 작동합니다. – Darren

+0

지적 해 주셔서 감사합니다. 귀하의 의견으로 코드를 업데이트했습니다. – marceloemanoel