接收错误: 未捕获的TypeError:跟随(...)。然后(...)。完成不是函数
这是 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:
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
的质量信息答案 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