【问题标题】:Why do I get undefined from the Promise? - Updated为什么我从 Promise 中得到未定义? - 更新
【发布时间】:2017-06-20 21:29:12
【问题描述】:

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

但是当我在accounts()中的Promise中console.log“数据”时,数组返回:

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

有什么建议吗?

【问题讨论】:

  • scrapeModule 返回什么?
  • 您在哪里记录accounts() 中的值?你在哪里打电话给resolve() 你正在创建的第一个承诺?您似乎没有向我们展示某些代码。
  • FWIW,看起来您已经在使用 Promise,并且您创建了太多 new Promises,而您可以简单地返回您已经获得的那些。
  • 抱歉不清楚。我重新制作了问题中的原始代码以使其更易于阅读。我首先用 scrapeModule 做了一个 Promise.all,然后简单地将“data”设置为 promise 返回的第一个变量。至于数据,它返回一个包含来自 html 文档的文本的数组。感谢您的简化。我已经更新了代码

标签: javascript promise


【解决方案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,而且嵌套的 for 看起来也错误 - 怀疑它应该有 keyValues[key[y]] = data[i][y]; - 但是你知道得更好,因为你可以运行代码并调试它

【讨论】:

  • 抱歉不清楚。我重新编写了问题中的代码以使其更易于阅读。我首先用 scrapeModule 做了一个 Promise.all,然后简单地将“data”设置为 promise 返回的第一个变量。至于数据,它返回一个包含来自 html 文档的文本的数组。谢谢你的简化,我会尽量缩短它
  • 试着像你展示的那样简化它,谢谢。虽然,promise 现在返回 undefined 。更新了问题中的代码
【解决方案2】:

这是一个简单的迭代问题。该循环不适用于 Promise,因此我创建了一个包含多个 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)});
        });
};

【讨论】:

    猜你喜欢
    • 2019-10-31
    • 1970-01-01
    • 1970-01-01
    • 2021-12-30
    • 2016-01-18
    • 2021-03-24
    • 2015-03-23
    • 2012-02-05
    • 1970-01-01
    相关资源
    最近更新 更多