2017-04-27 11 views
1

mercury-client을 사용하여 내용을 구문 분석 할 링크 배열이 있으며 결과를 articles 정렬.mercury-client를 사용하여 구문 분석하고 구문 분석 된 내용을 새로운 배열로 푸시하는 링크 배열을 반복 할 것을 약속합니다.

* parseLinks() { 
    const links  = yield this.getInboxMessages() // It will be ['link1', 'link2', ..., 'linkN'] 
    const articles = [] 

    return new Promise((resolve, reject) => { 
    for (let link of links) { 
     mercury.parse(link).then((data) => { 
     articles.push(data) 
     }) 
    } 

    resolve(articles) 
    }) 
} 

나는 나는 단지 []을 얻기 위해, 잘못을 확인하려면 실패합니다. Promisefor..of으로 이동하려고했지만 결과는 동일하게 유지되었습니다.

루프를 제거하고 첫 번째 인덱스 인 links 배열 만 구문 분석하면 아무런 문제가 없습니다.

답변

6

articles이 가득 차기 전에 너무 일찍 해결해야합니다.

이와 전체 return 블록을 대체 할 수있다 : 한 번만 모든 링크가 처리 된 해결 약속을 반환합니다

return Promise.all(links.map(link => mercury.parse(link))); 

합니다.

(그리고 경우에만) mercury 당신이 더 간단하게 할 수있는 this 컨텍스트 변수로 전달되는 것을 필요없이 베어 함수 참조로 전달되는 대처할 수있는 mercury.parse 기능은 경우

return Promise.all(links.map(mercury.parse)); 
+0

간단하고 쉽습니다. 고맙습니다. – mfgabriel92

+0

@ JaromandaX 답변에 적절한 제안 사항을 추가했습니다. – Alnitak

1

for 루프가 데이터를 거기에 밀어 넣는 동안 syncynclyly resolve(articles)을 호출하기 때문에 [] 개의 기사를 얻을 수 있습니다. 해결 된 data을 기사로 푸는 대신 mercury.parse(link)을 배열에 푸시합니다. 해결해야 할 일련의 수은 - 클라이언트 약속이 끝날 것입니다. 그런 다음 해당 배열에서 Promise.all을 사용하고 모든 약속이 해결 된 경우에만 articles을 해결할 수 있습니다.

0

당신은 달성 할 수있다 Array.prototype.reducePromise.all 조합입니다. 아래처럼.

function parseLinks() { 
    const links = [....] 

    return Promise.all(links.reduce((promises, link) => { 
    return promises.concat(mercury.parse(link)) 
    }, [])) 
} 

parseLinks().then(links => console.log(links))