2016-09-09 4 views
0

나는 Xray로 수집 한 메타 데이터가있는 배열을 채우려고했지만 아무런 성공도 거두지 못했습니다. 함수는 내 서버에서 API 경로에 의해 호출되며 내 응용 프로그램에서 링크를 가져옵니다.Xray에서 수집 한 메타 데이터로 배열 채우기

메타 데이터를 긁어내는 데 시간이 걸리므로 약속이 어려워 보입니다. 계속 이동하기 전에 데이터가 수집 될 때까지 기다릴 수없는 것처럼 보입니다. 아마도 저는 Xray가 어떻게 작동하는지 이해하지 못하고 있을까요? 아니면 약속 할까? 나는 이것이 가장 최근의 시도 (그리고 간단한)되고, 내가 생각할 수있는 모든 것을 시도했다 :

function createCollection() { 
    Promise.all(rawLinks.map(function(link) { 
     linksArray.push(xray(link, 'title')(function(error, title) { 
     console.log(title); 
     return title; 
     })) 
    })) 
    .then(linksArray => { 
     console.log(linksArray); 
    }); 
    } 

그것은 지금까지하지 않음으로써 내가 해봤 가장 강력한 또는 정교한 솔루션입니다,하지만 가장 최근의 . 먼저 콘솔은 데이터로 "정의되지 않은"배열을 기록한 다음 개별 제목을 기록합니다.

어떤 도움을 주거나 연구 할 방향에 대해 매우 감사하게 생각합니다. 말했듯이, 나는 마치 내 모든 아이디어를 다 써 버렸고 더 이상 볼 곳을 모른다.

+1

'map' 콜백에서 무언가를'linksArray'로 푸시하지 말고 하나의 항목에 대해'return' 만하면됩니다. – Bergi

+1

어떤 약속 라이브러리를 사용하고 있습니까? 'xray' 함수를 [promisify] (http://stackoverflow.com/q/22519784/1048572)해야 할 것입니다. – Bergi

답변

0

이것을 생각해 보면,이 트릭을하는 것처럼 보입니다!

// format links into an array of objects 
    var rawLinks = links.split(', '); 
    var linksArray = []; 

    createCollection(); 

    function createCollection() { 
    rawLinks.map(function(link) { 
     var fillMetaPromise = new Promise(
     function(resolve, reject) { 
      var test = xray(link, 'title')(function(err, title) { 
      var data = { title: title, link: link }; 
      resolve(data); 
      }); 
     }) 
     .then(data => { 
      processTitle(data.title, data.link); 
     }); 
    }); 
    } 

    function processTitle(title, link) { 
    var object = { 
     link: link, 
     title: title 
    }; 

    linksArray.push(object); 
    console.log(linksArray); 
    } 
+0

'if (err) reject (err)' – Bergi

+1

당신이 약속을 어디에서나 반환하지 않는다면, 모든 것을 기다릴 수는 없습니다. – Bergi

+0

고마워요! 알겠습니다! –