2017-02-03 3 views
-3

Я пытаюсь разрешить массив с объектами, но массив возвращается только с одним значением. scrapeModule возвращает массив текстовых значений. Вот код:Почему я получаю неопределенный от обещания? - Обновлено

"use strict"; 

var scrapeModule = require("./scrape"); 

const accounts = function(promiseObj, link) { 

    // Update the url-value in promiseObj 
    promiseObj.url = promiseObj.url.replace(config.url.substring(19), JSON.parse(link)); 

    return scrapeModel(promiseObj).then((arrayContainingText) => { 
    let arrayIWantToSend = [] 

      arrayContainingText.forEach(function(nameHTML) { 

        fetchObj(promiseObj, name).then(function(data) { 
        arrayIWantToSend.push(data) 

        return data; 
        console.log(data) =>  
[ { key1: 'v1', key2: 'v2', key3: 'v3'}, 
    { key1: 'v1', key2: 'v2', key3: 'v3'}, 
    { key1: 'v1', key2: 'v2', key3: 'v3'} ] 

       }) 
     }); 
}; 

const fetchObj = function(promiseObj, link) { 

    let keyValues = {}; 

    // Clone the old promiseObj 
    let thObj = JSON.parse(JSON.stringify(promiseObj)); 
    let tdObj = JSON.parse(JSON.stringify(promiseObj)); 

    // Replace the track-values 
    thObj.track = "th"; 
    tdObj.track = "td"; 

    return Promise.all([scrapeModule((thObj)), scrapeModule((tdObj))]).then(data => { 
     let key = data[0]; 
     let v = data[1]; 

     for (let i = 0; i < data.length; i++) { 
      for (let y = 0; y < data[i].length; y++) { 

       keyValues[key[y]] = data[y]; 
      } 
     } 

      return keyValues 
    }); 

}; 

module.exports = accounts; 

Я регистрирую результат обещания с помощью этого кода в другом модуле. Я хочу, чтобы возвращаемое значение из функции будет массив со значениями:

accounts(url, link) 
    .then(function(data) { 
     console.log(data) 
    }); -- > //[ undefined ] 

Но когда я console.log «данные» в Promise на счетах(), то возвращает массив:

[ { key1: 'v1', key2: 'v2', key3: 'v3'}, 
    { key1: 'v1', key2: 'v2', key3: 'v3'}, 
    { key1: 'v1', key2: 'v2', key3: 'v3'} ] 

Какие-либо предложения?

+1

И что возвращает 'scrapeModule'? –

+0

Где вы регистрируете значение в 'accounts()'? Где вы вызываете 'resolve()' для этого первого обещания, которое вы создаете? Кажется, есть код, который вы нам не показываете. – JLRishe

+1

FWIW, похоже, вы уже работаете с обещаниями, и вы создаете слишком много «новых обещаний», когда можете просто вернуть те, которые у вас уже есть. – deceze

ответ

0

Это была простая итерационная проблема , Петля не работала с обещаниями, поэтому я сделал массив с несколькими обещаниями и отправил их в Promise.all

return scrapeModel(promiseObj).then((arrayContainingText) => { 
      var promises = []; 

      data.forEach(function(name) { 
       promises.push(fetchObj(promiseObj, name)) 
      }); 

      return Promise.all(promises).then(function(data) { 

       return data; 
      }).catch(function(e) {console.log(e)}); 
     }); 
}; 
1

Ваш код может быть значительно упрощена, принимая во внимание ваше использование let, то я также добавил другие ES6 «особенности» слишком

var scrapeModule = require("./scrape"); 
const accounts = function(promiseObj, link) { 
    // Update the url-value in promiseObj 
    promiseObj.url = promiseObj.url.replace(config.url.substring(19), JSON.parse(link)); 

    return scrapeModel(promiseObj) 
    .then(arrayContainingText => 
     Promise.all(arrayContainingText.map(nameHTML => 
      fetchObj(promiseObj, name) 
     )) 
    ); 
}; 

const fetchObj = ... // no changes 

module.exports = accounts; 

Я не сделал никаких изменений в fetchObj, потому что теперь эта функция выглядит странно в том, что он принимает аргумент link, который он никогда не использует, и вложенный для него вид тоже неправильный - предположим, что он должен иметь keyValues[key[y]] = data[i][y];, - но вы знаете, потому что вы можете запустить код и отладить его.

+0

Извините за непонятность. Я переделаю код в вопросе, чтобы его было легче читать. Сначала я сделал Promise.all с scrapeModule и просто установил «данные» в качестве первой переменной, которую обещало вернуть. Что касается данных, он возвращает массив с текстом из html-документа. Спасибо за упрощение, я постараюсь его укоротить. – Jesper

+0

Пробовал упростить его, как вы показали, спасибо. Хотя обещание теперь не определено. Обновлен код в вопросе – Jesper