为什么我从Promise中得到了不确定? - 更新

时间:2017-02-03 13:28:11

标签: javascript promise

我试图用对象解析一个数组,但该数组只返回一个值。 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;

我使用此代码在另一个模块中记录promise的结果。我希望函数返回的值是带有值的数组:

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

但是当我在console.log&#34;数据&#34;在accounts()中的Promise中,数组返回:

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

有什么建议吗?

2 个答案:

答案 0 :(得分: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,嵌套的看起来也是错误的 - 怀疑它应该{ {1}} - 但你知道的更好,因为你可以运行代码并对其进行调试

答案 1 :(得分:0)

这是一个简单的迭代问题。循环不适用于Promises,所以我创建了一个包含多个promise的数组并将它们发送到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)});
        });
};