如何解决javascript“not a function”错误

时间:2018-02-17 08:45:13

标签: javascript reactjs

接收错误: 未捕获的TypeError:跟随(...)。然后(...)。完成不是函数

enter image description here

这是 app.js 中的代码块:

class App extends React.Component {
    constructor(props) {
        super(props)
        this.state = {customRectangles: []};
    }

    loadFromServer(pageSize) {
        follow(client, root, [
            {rel: 'customRectangles', params: {size: pageSize}}]
        ).then(rectangleCollection => {
            return client({
                method: 'GET',
                path: rectangleCollection.entity._links.profile.href,
                headers: {'Accept': 'application/schema+json'}
            }).then(schema => {
                this.schema = schema.entity;
                return rectangleCollection;
            });
        }).done(rectangleCollection => {
            this.setState({
                customRectangles: rectangleCollection.entity._embedded.customRectangles,
                attributes: Object.keys(this.schema.properties),
                pageSize: pageSize,
                links: rectangleCollection.entity._links});
        });
    }

    componentDidMount() {
        this.loadFromServer(this.state.pageSize);
    }

    render() {
        return (
            <RectangleList customRectangles={this.state.customRectangles}/>
        )
    }
}

这是我的 follow.js 文件:

module.exports = function follow(api, rootPath, relArray) {
    var root = api({
        method: 'GET',
        path: rootPath
    });

    return relArray.reduce(function(root, arrayItem) {
        var rel = typeof arrayItem === 'string' ? arrayItem : arrayItem.rel;
        return traverseNext(root, rel, arrayItem);
    }, root);

    function traverseNext (root, rel, arrayItem) {
        return root.then(function (response) {
            if (hasEmbeddedRel(response.entity, rel)) {
                return response.entity._embedded[rel];
            }

            if(!response.entity._links) {
                return [];
            }

            if (typeof arrayItem === 'string') {
                return api({
                    method: 'GET',
                    path: response.entity._links[rel].href
                });
            } else {
                return api({
                    method: 'GET',
                    path: response.entity._links[rel].href,
                    params: arrayItem.params
                });
            }
        });
    }

    function hasEmbeddedRel (entity, rel) {
        return entity._embedded && entity._embedded.hasOwnProperty(rel);
    }
};

我想我此时已经看了一段时间太长了,我真的很感激为解决此问题所需的代码调整提供的任何帮助。如果您需要更多信息,请告诉我,谢谢!

解决

解决方案就像@sorja所述,除了我需要它来获取一个函数并返回一个Promise / object。使用.then()和.done()时,我遇到了挑战。最终,上述代码仅在follow func:

中更改了2行
module.exports = function follow(api, rootPath, relArray) {
    var self = this;
    return new Promise(function (self) {
        var root = api({
            method: 'GET',
            path: rootPath
        });
    //...

我不确定这是否是真正的异步设置,或者我是否可以使用模拟Promise,但我实现了此处概述的Promise状态机:Basic Javascript promise implementation attempt

学到了很多,而且效果很好所以无论哪种方式都很好。来自@ForbesLindesay以及@trincot

的质量信息

1 个答案:

答案 0 :(得分:3)

你正打算打电话给&#39;然后&#39;对象的功能&#39;跟随&#39;但问题是,&#39;关注&#39;是一个函数,而不是Promise(/ object)。

您可以尝试将函数包装在新的Promise中,如下所示:

module.exports = new Promise(function(resolve, reject) {
  if(all ok) {
    resolve(params)
  } else {
    reject(params)
  }
});

有关Promises的更多信息,请参阅MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise