Javascript 有没有一种方法可以从fetchapi返回解析后的数据,而不是承诺?

Javascript 有没有一种方法可以从fetchapi返回解析后的数据,而不是承诺?,javascript,promise,fetch,Javascript,Promise,Fetch,我正在构建一个应用程序,使用fetch从API获取一些数据,并将其注入到网页中。该应用程序以模型-视图-控制器模式构建。我希望在模型中获取和解析数据,并在控制器中向网站注入数据。然而,fetch返回一个promise使这变得相当棘手,因为它似乎让我可以选择要么在控制器中进行解析,要么从模型中进行注入,这两者我都希望避免 有没有一种方法可以构造一个函数,使它在解析后从fetch返回数据,而不是承诺 我现在所拥有的: function showMessages() { fetch('https:/

我正在构建一个应用程序,使用fetch从API获取一些数据,并将其注入到网页中。该应用程序以模型-视图-控制器模式构建。我希望在模型中获取和解析数据,并在控制器中向网站注入数据。然而,fetch返回一个promise使这变得相当棘手,因为它似乎让我可以选择要么在控制器中进行解析,要么从模型中进行注入,这两者我都希望避免

有没有一种方法可以构造一个函数,使它在解析后从fetch返回数据,而不是承诺

我现在所拥有的:

function showMessages() {
 fetch('https://example-api.com/messages')
   .then(function(response) {
     response.json();
   })
   .then(function(messages) {
     this.messageView.wrapInHTML(messages);
   })
   .then(function(wrappedMessages) {
     document.getElementById('messages').innerHTML(wrappedMessages);
   });
}
虽然我想要这样的东西:

// in messageModel.js

MessageModel.prototype.fetchMessages = function() {
 fetch('https://example-api.com/messages')
   .then(function(response) {
     response.json();
   })


// in messageController.js

function showMessages() {
  messageData = this.messageModel.fetchMessages();
  wrappedMessages = this.messageView.wrapInHTML(messages);
  document.getElementById('messages').innerHTML(wrappedMessages);
}
半解 虽然有点粗俗,也许是一种反模式。您可以使用以下方法在页面上使用同步请求预加载该数据:

head
  script(id='jsonData_1', type='application/json', src="/foo/bar/json")
  // Other JS/Imports etc
或者使用
文档。编写
并加载JSON,如下所示:

head
  script.
    document.write('\x3Cscript type="application/json" src="/foo/bar/j.json">\x3C/script>');
注意:为便于阅读,HTML是用PUG/HAML编写的

在代码本身中,读取该数据的DOM,如:

const data = JSON.parse(document.getElementById('#jsonData_1').innerHTML)
最后的想法
再说一遍,请不要这样做。但是有一种方法;)

你无法回避这个问题的异步本质。您可以使用
async/await
使它看起来更同步,但它只会使它看起来更同步。您还可以返回由
fetch
生成的承诺,该承诺允许您在
showMessages()
中处理内容。与“是否有办法立即打开亚马逊下周交付的软件包(并使用其内容)”相同?很有趣,感谢您的回答。我目前正在学习一门课程,他们建议我们使用fetch,但应用程序的要求包括使用MVC模式和维护单一责任原则。看来用fetch是不可能的。