Javascript 承诺内的AJAX请求即使在guard子句之后也会执行
我遇到了一个令人费解的小问题:当我在promise对象中的Javascript 承诺内的AJAX请求即使在guard子句之后也会执行,javascript,ajax,Javascript,Ajax,我遇到了一个令人费解的小问题:当我在promise对象中的$.ajax(…)语句前面有一个guard子句时,如果激活了guard子句,ajax请求仍然会被调度: function conditionalRequest(label, value) { return new Promise((resolve, reject) => { if (!value) reject(`${label}: Nothing is done`);
$.ajax(…)
语句前面有一个guard子句时,如果激活了guard子句,ajax请求仍然会被调度:
function conditionalRequest(label, value) {
return new Promise((resolve, reject) => {
if (!value)
reject(`${label}: Nothing is done`);
// Still dispatched even if `value` is falsy
$.ajax(...)
});
}
但是,在guard子句中放置return语句将停止下游AJAX的执行:
function conditionalRequest(label, value) {
return new Promise((resolve, reject) => {
if (!value) {
reject(`${label}: Nothing is done`);
return; // This fixes the issue
}
// Now when `value` is falsy, the guard clause ends :)
$.ajax(...)
});
}
我可能遗漏了一些重要的内容,因为我只是假设调用resolve()
或reject()
将意味着在承诺内返回return
。下面是上面的代码,但稍微扩展以更好地演示启用了登录到控制台的问题:
函数条件请求(标签、值){
返回新承诺((解决、拒绝)=>{
如果(!值){
log(`${label}:值为falsy,保护语句已激活`);
拒绝(`${label}:什么都不做`);
返回;
}
$.ajax({
网址:'https://jsonplaceholder.typicode.com/posts/1',
键入:“GET”,
发送前:()=>{
log(`Sending request:${label}`);
}
}).done(数据=>{
log(`${label}:Data received`);
解析(数据);
}).失败(()=>{
拒绝(`${label}:端点`错误);
});
});
};
var asyncRequest1=条件请求('Request#1',true);
var asyncRequest2=条件请求('Request#2',false);
asyncRequest1.then(successPayload=>{
console.log(successPayload);
},failurePayload=>{
控制台日志(失效有效载荷);
});
asyncRequest2.then(successPayload=>{
console.log(successPayload);
},failurePayload=>{
控制台日志(失效有效载荷);
});代码>
resolve/reject只是设置传递给then()回调的值,它不是一个隐含的返回。@PatrickEvans谢谢,这很有意义:)如果您添加您的注释作为答案,我将非常乐意接受。干杯