获取返回先前的响应

fetch returning previous response

我正在使用 fetch Api 从我的项目中读取本地文件。

一些代码也是如此,但问题是我对请求的响应始终是前一个。

 var tmplText = [sometextForReplament]
 var textToBeReplace;
 var enumText = [someText]//as example, here is where the $enum to be replaced  is

  async function ReadFileFromProject() {

  let data = await fetch('/assets/groovy.txt')
       .then(response => response.text())
       .then(data => {

          tmplText.push(data);

         textToBeReplace = tmplText[0];

            if (textToBeReplace.indexOf('$enum') > -1)
            {
                textToBeReplace = textToBeReplace.replace('$enum', enumText);

            }

         console.log(textToBeReplace);
        console.log(filename + 'exported with success');
       })
       .catch(error => {
        alert('Can not read local file:' + error);
          return error;
        });
 }

我以为异步和等待是为了让我的异步请求同步,不是吗?

我认为你真的需要在 re-usability 和你的方法的程序流程上工作,有一些错误使得在没有完整示例的情况下很难猜测发生了什么,但我确实有一个建议的重写,告诉你如何重构它

function getData( url ) {
  return fetch( url )
    .then( response => {
      if ( response.ok ) {
        // return the response itself
        return response;
      }
      // well the response wasn't okay, throw an error, break the chain
      throw '400 Bad request';
   });
}

function replaceContentWithEnumText( url, enumText ) {
  return getData( url )
    // valid data, we want the response as text
    .then( resp => resp.text() )
    // split the text (if any, and join it with enumText)
    .then( text => {
      return text && text.split( '$enum' ).join( enumText );
    } );
}

// note for here it isn't a valid url, so you really wont see anything)
replaceContentWithEnumText( '/assets/groovy.txt', 'someText' )
  // once in the below then, fetch has happened, your text was replaced, you can use replacedContent
  .then( replacedContent => console.log( 'comleted succesfully, data returned would be ', replacedContent ) )
  // something went wrong in the entire chain of events, handling it here makes sense
  .catch( err => console.log( 'error occured', err ) );

如果我要看你的原始代码,对我来说:

  • 我不喜欢神奇的全局变量,它们会发生变异,它们真的帮不了你,你永远不知道它们的状态...
  • 你的函数是用大写字母写的,虽然这可能是一个准则,但惯例会给函数小写字母开头
  • 您将 let data 分配给 await fetch...,最多数据会在那里包含错误消息,因为只有从 catch 块中您才真正 returning 某些东西
  • 您似乎没有对 let data 变量做任何事情
  • 在你的承诺链中,你有一个 data 参数(令人困惑)
  • 你的 async/await 完全是多余的,你的代码甚至没有使用它(我知道你相信 await 使你的代码同步,但是,它并没有像你想象的那样工作)

async 标记的函数将隐式 return 一个承诺。你可以 await 承诺,然后 return 承诺链对你分配给它的任何内容的响应。您的代码将等待继续,直到 promise 运行完毕(但是,不是您的程序,它将继续 运行)。

它实际上只是 promise 的语法糖,有人说它使它更具可读性,但这完全是基于意见的。