2017-02-03 21 views
-3

私はオブジェクトで配列を解決しようとしていますが、配列は1つの値だけを返します。 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; 

私はこのコードを使って別のモジュールに結果を記録しています。私は、関数からの戻り値は、値の配列になりたい:私は口座の約束(で「データ」にconsole.logとき)

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

しかし、配列が返されます。

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

を助言がありますか?

今、その関数が奇妙に見えるので、私は fetchObjへの変更を加えていないてきたあなたのコードが大幅にすぎ

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; 

、私はまた、他のES6「機能」を追加しました、letの使用を考慮し、簡素化することができる

+1

と '何を返すscrapeModule'んがPromise.allするには、それらを送っ? –

+0

ここで 'accounts()'に値を記録していますか?あなたが作成している最初の約束のために 'resolve()'を呼び出しているところはどこですか?あなたが私たちに示していないコードがあるようです。 – JLRishe

+1

FWIW、あなたはすでに約束をしているようですが、あなたがすでに手に入れているものを単に返すことができるとき、あなたは全く新しい "約束"をたくさん作り出しています。 – deceze

答えて

0

コードやデバッグを実行することができますので、あなたがよく知っています。ループは約束では動作しませんでしたので、私は複数の約束を持つ配列を作って

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

その中でそれが使用することはありませんという議論linkをとり、そしてあまりにも間違ったルックスのためにネストされた - それはkeyValues[key[y]] = data[i][y];を持つべきである疑いがある - しかし、あなたはそれは単純な反復処理-問題だった、それは

+0

不明な点をおかけして申し訳ありません。質問の中のコードを読みやすくするために作り直しました。私は最初にscrapeMallを使ってPromise.allを行い、単に "data"を約束した最初の変数に設定しました。データに関しては、htmlドキュメントからテキストを含む配列を返します。簡素化をありがとう、私はそれを短縮しようとします – Jesper

+0

あなたが示したようにそれを簡素化しようとしました、ありがとう。しかし、代わりに未定義が返されます。問題のコードを更新しました – Jesper

関連する問題