获取返回先前的响应
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 的语法糖,有人说它使它更具可读性,但这完全是基于意见的。
我正在使用 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 的语法糖,有人说它使它更具可读性,但这完全是基于意见的。