【发布时间】:2020-11-09 23:29:06
【问题描述】:
我正在使用纯 javascript 和 Web 组件构建应用程序。我也想使用 MVC 模式,但现在我遇到了来自模型的异步调用问题。
我正在开发一个meal-list 组件。数据来自 API 格式的 JSON,格式如下:
[
{
id: 1,
name: "Burger",
},
]
我希望控制器从模型中获取数据并将其发送到视图。
meals.js(模型)
export default {
get all() {
const url = 'http://localhost:8080/meals';
let speisekarte = [];
fetch(url, {
method: 'GET',
headers: {
'Content-Type': 'application/json'
},
}).then(res => {
return res.json()
}).then(data => {
// This prints the result I want to use, but I can't return
console.log(data);
// This does not work
speisekarte = data;
// This also does not work
return data;
});
// is undefined.
return speisekarte;
},
}
这就是我尝试从 API 获取数据的方式。
meal-list.component.js(控制器)
import Template from './meal-list.template.js'
import Meal from '../../../../data/meal.js'
export default class MealListComponent extends HTMLElement {
connectedCallback() {
this.attachShadow({mode: 'open'});
// Should send the Data from the model to the View
this.shadowRoot.innerHTML = Template.render(Meal.all);
}
}
if (!customElements.get('mp-meal-list')) {
customElements.define('mp-meal-list', MealListComponent);
}
meal-list.template.js(查看)
export default {
render(meals) {
return `${this.html(meals)}`;
},
html(meals) {
let content = `<h1>Speisekarte</h1>
<div class="container">`;
content += /* display the data from api with meals.forEach */
return content + '</div>';
},
}
正如我在 cmets 中提到的,我在将异步数据从模型返回到视图时遇到了问题。当我尝试return data; 或尝试将数据保存到数组中时,它是未定义的。我也可以返回整个fetch() 方法,但这会返回一个promise,我认为控制器不应该处理promise。
我已经阅读了How do I return the response from an asynchronous call? 中的长线程,但我无法将其与我的案例联系起来。
【问题讨论】:
-
如果你使用Events,你会在Fetch得到数据后调度一个Event
标签: javascript asynchronous web-component fetch-api