Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 承诺内的AJAX请求即使在guard子句之后也会执行_Javascript_Ajax - Fatal编程技术网

Javascript 承诺内的AJAX请求即使在guard子句之后也会执行

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`);

我遇到了一个令人费解的小问题:当我在promise对象中的
$.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谢谢,这很有意义:)如果您添加您的注释作为答案,我将非常乐意接受。干杯