2016-09-09 15 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

Вы не должны нажимать что-то на 'linksArray' в этом обратном вызове' map', но просто «возвращаете» обещание для одного элемента. – Bergi

+1

Какую библиотеку обещаний вы используете? Вам нужно [promisify] (http://stackoverflow.com/q/22519784/1048572) функцию 'xray'. – 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

Спасибо! Я ценю это! –