2016-09-09 3 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''に何かをプッシュするが、ちょうど '1つの項目の約束を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

ありがとう!私はそれを感謝します! –

関連する問題