单击按钮,我试图一个接一个地调用多个API。这样的事情。然后路由到其他路径。
onRowClick = (id) => {
this.props.selectQuestionnaire(id)
this.props.getSpecificQuestionnaireAQ(id)
this.props.getAQoptions(id)
this.props.getAQResultarray(id)
history.push('/answerques')
};
所有这些都在redux层中指定为操作,我正在使用访存库进行这些API调用。此类操作的一个示例是:
export function getAQResultarray(aqid){
return function(dispatch){
console.log("fetching specific AQ")
var myHeaders = new Headers();
myHeaders.append('Accept' , 'application/json');
myHeaders.append('Content-Type' , 'application/json');
myHeaders.append('x-Auth-Token' , localStorage.getItem('authtoken'));
const myInit = {
headers: myHeaders,
credentials : 'same-origin'
};
var url="http://10.00.000.00:000/abc/api/v1/"+aqid
console.log(url);
var myRequest = new Request(url)
fetch(myRequest, myInit)
.then((response) => {
console.log("Response for aq responses notfications : ",response)
return response.json();
})
.then((tokenData) => {
console.log("posting aq responses specific : ",tokenData);
dispatch({
type : AQ_RESPONSEARRAY,
payload : tokenData
})})
.catch((error) => {
console.log(error);
});
}
};
我如何使此代码起作用,以使API调用以同步方式发生?我的意思是,每个动作只有在上一个动作完成后才被调用。
我听说过诺言,以及异步/等待。哪个更容易实现?
答案 0 :(得分:1)
如果我不能正确理解您的问题,则只希望链接最后一段代码,即重定向。虽然可以完全并行执行这些动作。为实现这一目标,您的行动创建者应返回承诺,不要破坏承诺链。
onRowClick = (id) => {
// run all actions in parallel
Promise.all([this.props.selectQuestionnaire(id)
this.props.getSpecificQuestionnaireAQ(id)
this.props.getAQoptions(id)
this.props.getAQResultarray(id)])
.then(() => history.push('/answerques'))
};
修复动作创建者,以退还笨蛋的诺言。
export function getAQResultarray(aqid){
return function(dispatch){
console.log("fetching specific AQ")
var myHeaders = new Headers();
myHeaders.append('Accept' , 'application/json');
myHeaders.append('Content-Type' , 'application/json');
myHeaders.append('x-Auth-Token' , localStorage.getItem('authtoken'));
const myInit = {
headers: myHeaders,
credentials : 'same-origin'
};
var url="http://10.00.000.00:000/abc/api/v1/"+aqid
console.log(url);
var myRequest = new Request(url)
// NB! return statement
return fetch(myRequest, myInit)
.then((response) => {
console.log("Response for aq responses notfications : ",response)
return response.json();
})
.then((tokenData) => {
console.log("posting aq responses specific : ",tokenData);
dispatch({
type : AQ_RESPONSEARRAY,
payload : tokenData
})})
.catch((error) => {
console.log(error);
});
}
};
如果您实际上想一个接一个地运行动作(但我怀疑您确实需要它),则最好至少在处理程序中坚持使用async/await
语法。但是无论如何,您的动作创作者的重击应该最终返回一个诺言。
onRowClick = async (id) => {
await this.props.selectQuestionnaire(id)
await this.props.getSpecificQuestionnaireAQ(id)
await this.props.getAQoptions(id)
await this.props.getAQResultarray(id)
history.push('/answerques')
};