如何解决如果根据条件返回后续的承诺,如何使用承诺链?
我们有一个需要运行API-1的要求。如果成功并且API响应的结果为“ true”,则需要运行API-2;如果成功并且API响应的结果为“ true”,则需要运行API-3。我尝试使用如下所示的Promise链。
runMethodGeneric('A').then((data,status,xhr) => {
if(xhr.status === 200) {
if(data.result === 'true') {
runGenieMethodGeneric('B');
} else {
console.log('A result is false');
}
}
}).then((data,xhr) => {
console.log(data);
if(xhr.status == 200) {
if(data.result === 'true') {
runGenieMethodGeneric('C');
} else {
console.log('B result is false');
}
}
}).then((data,xhr) => {
console.log(data);
if(xhr.status === 200) {
if(data.result === 'true') {
console.log('C result is true');
} else {
console.log('C result is false');
}
}
}).catch((jqXhr,textStatus,errorMessage) => {
console.log(errorMessage);
});
runMethodGeneric是运行所有API的通用方法,其定义如下。
function runMethodGeneric(method) {
let url = 'http://192.168.1.253:55678/cl';
const json = {
user_data: data,params: [],gene_method: method,requestedAction: 'RUN_GENIE_METHOD'
};
let jsonStr = JSON.stringify(json);
return $.ajax(url,{
type: 'POST',dataType: 'JSON',data: jsonStr,});
}
我在html中使用的是'https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js'。
第一个API调用“ A”正在运行,并且控件正在按第一个“ then”块,并且执行了第二个API调用“ B”。当控件击中第二个“ then”块时,即使第二个API调用“ B”正在工作并获得正确的结果,数据,状态和xhr均未定义。
jQuery.Deferred exception: Cannot read property 'status' of undefined TypeError: Cannot read property 'status' of undefined
at http://localhost:5000/chat.js:95:10
at j (https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js:2:29999)
at k (https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js:2:30313) undefined
有人可以帮助我解决以下问题吗?
- 我想知道这是否是做承诺链的正确方法?因为runMethodGeneric函数返回Promise。但是不确定如何使用API调用B和C返回的那些承诺,因为我正在根据结果调用这些API调用。
- 如果上述方法不正确,如何做满足要求的承诺链(运行API-1。如果成功,并且API响应的结果为“ true”,则运行API-2,如果成功,则结果API响应的值为“ true”,请运行API-3)
- 我是否需要在“ then”块中检查 xhr.status === 200 ?我认为,只有在API调用成功后,控件才会到达“ then”块。这个假设正确吗?
解决方法
您可以使用async/await
语法和for...of
循环来简化此操作,这将允许您一个接一个地执行请求,还可以在循环外将条件添加到break
function fetchData(method) {
let url = `https://jsonplaceholder.typicode.com/todos/${method}`;
return $.ajax(url,{
type: 'GET'
});
}
async function runMethods() {
const methods = [1,2,'foo',3,4];
for (let method of methods) {
try {
const response = await fetchData(method);
// do your checking here
// break out of the loop if condition true
if (response.id == 3) {
console.log(response)
console.log('exiting on 3')
break;
} else {
console.log(response)
}
} catch (err) {
// you can also break on error here
console.log(`${err.status} for ${method} method`)
}
}
}
runMethods()
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
,
基本上,您的函数MATCH path = (p1:Author)-[r:CO_AUTHORSHIP]-(p2:Author) WITH collect(p1)+collect(p2) as
export_nodes,collect(r) as export_rels CALL
apoc.export.cypher.data(export_nodes,export_rels,'/tmp/export.cypher',{format:'cypher-
shell',cypherFormat: 'updateAll'}) YIELD file,source,format,nodes,relationships,properties,timeRETURN nodes,time
返回一个Promise
runMethodGeneric
因此,当您执行此功能时,您需要function runMethodGeneric(method) {
let url = 'http://192.168.1.253:55678/cl';
const json = {
user_data: data,params: [],gene_method: method,requestedAction: 'RUN_GENIE_METHOD'
};
let jsonStr = JSON.stringify(json);
// HERE IS YOUR RETURN FUNCTION
return $.ajax(url,{
type: 'POST',dataType: 'JSON',data: jsonStr,});
}
才能解决此功能的响应
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。