Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/429.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/75.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 在2个AJAX调用中使用when_Javascript_Jquery_Ajax - Fatal编程技术网

Javascript 在2个AJAX调用中使用when

Javascript 在2个AJAX调用中使用when,javascript,jquery,ajax,Javascript,Jquery,Ajax,我有两个功能addItem和removietem将POST添加到给定URL。这些AJAX调用工作正常。但是,它们需要同步。我试图通过使用.when使它们同步。我的代码基本上如下所示: $.when(additem()).done(removeItem()); $.when(additem()).done(function(){ removeItem(<arguments here>); }); 但这似乎无法正常工作,请求同时被触发 我还尝试在请求的complete中放置一个函

我有两个功能
addItem
removietem
POST
添加到给定URL。这些AJAX调用工作正常。但是,它们需要同步。我试图通过使用
.when
使它们同步。我的代码基本上如下所示:

$.when(additem()).done(removeItem());
$.when(additem()).done(function(){
  removeItem(<arguments here>);
});
但这似乎无法正常工作,请求同时被触发

我还尝试在请求的
complete
中放置一个函数,如下所示:

$.ajax({
  type: "POST",
  url: '/cart/update.js',
  data: {updates: updates},
  dataType: 'json', 
  complete: removeItem()
});
但这似乎也不起作用。。在开始下一个AJAX请求之前,完成一个AJAX请求的正确方法是什么


谢谢

引用函数和调用函数是有区别的

  • 若要引用函数,请仅使用其名称
  • 要调用函数,请使用其名称后跟括号
设置回调(异步或非异步)时,您希望引用函数,而不是调用它。在第二次函数调用后包含括号会使调用立即发生

试试这个:

$.when(additem()).done(removeItem);
或:

如果需要将参数传递给回调函数,则必须使用括号,但为了避免调用,应将函数包装在另一个函数声明中,如下所示:

$.when(additem()).done(removeItem());
$.when(additem()).done(function(){
  removeItem(<arguments here>);
});
$.when(additem()).done(function()){
removeItem();
});
或:

$.ajax({
类型:“POST”,
url:“/cart/update.js”,
数据:{更新:更新},
数据类型:“json”,
完成:函数(){
removeItem();
}
});

引用函数和调用函数之间有区别

  • 若要引用函数,请仅使用其名称
  • 要调用函数,请使用其名称后跟括号
设置回调(异步或非异步)时,您希望引用函数,而不是调用它。在第二次函数调用后包含括号会使调用立即发生

试试这个:

$.when(additem()).done(removeItem);
或:

如果需要将参数传递给回调函数,则必须使用括号,但为了避免调用,应将函数包装在另一个函数声明中,如下所示:

$.when(additem()).done(removeItem());
$.when(additem()).done(function(){
  removeItem(<arguments here>);
});
$.when(additem()).done(function()){
removeItem();
});
或:

$.ajax({
类型:“POST”,
url:“/cart/update.js”,
数据:{更新:更新},
数据类型:“json”,
完成:函数(){
removeItem();
}
});

问题在于如何调用它们。您正在立即调用这两个函数,而不是将它们作为参数传递给
$。当
完成时

由于
$.ajax
返回承诺(或类似承诺的对象),因此当完全返回时,可以省略
$

函数addItem(){
//$.ajax返回一个类似承诺的对象
返回新承诺(功能(解决、拒绝){
log('addinganitem…');
setTimeout(函数(){
console.log('已添加项');
解决();
}, 2000);
});
}
函数removietem(){
返回新承诺(功能(解决、拒绝){
log('删除项…');
setTimeout(函数(){
console.log('项目已被删除');
解决();
}, 2000);
});
}
//承诺实现“then”函数,该函数在承诺解析时运行
附加项()
.然后(删除项目)

问题在于如何调用它们。您正在立即调用这两个函数,而不是将它们作为参数传递给
$。当
完成时

由于
$.ajax
返回承诺(或类似承诺的对象),因此当
完全返回时,可以省略
$

函数addItem(){
//$.ajax返回一个类似承诺的对象
返回新承诺(功能(解决、拒绝){
log('addinganitem…');
setTimeout(函数(){
console.log('已添加项');
解决();
}, 2000);
});
}
函数removietem(){
返回新承诺(功能(解决、拒绝){
log('删除项…');
setTimeout(函数(){
console.log('项目已被删除');
解决();
}, 2000);
});
}
//承诺实现“then”函数,该函数在承诺解析时运行
附加项()
.然后(删除项目)
您可以使用

或修改您的代码:

$.ajax({
  type: "POST",
  url: '/cart/update.js',
  data: {updates: updates},
  dataType: 'json', 
  complete: removeItem
});
记住一件事,如果你看到一个函数后面有一个括号, 这意味着“执行”,因此如果为回调
完成
设置
removietem()
, 它不会被称为预期。当您将其设置为可以使用的
complete
时,将调用它

或修改您的代码:

$.ajax({
  type: "POST",
  url: '/cart/update.js',
  data: {updates: updates},
  dataType: 'json', 
  complete: removeItem
});
记住一件事,如果你看到一个函数后面有一个括号, 这意味着“执行”,因此如果为回调
完成
设置
removietem()

它不会被称为预期。当您将其设置为
complete

时,将调用它。其他答案说明了您正在调用函数并传递结果,而不是传递要调用的函数。此答案旨在强调ECMAScript 2017语言规范(ES8)中引入的新功能

从下面的代码段中可以看到,每一行在执行之前都会等待前一行完成;而如果没有async和Wait,则每一行都将在不等待异步调用完成的情况下执行

const asyncFunc=text=>新承诺((解析、拒绝)=>{
setTimeout(()=>解析(文本),1000)
})
异步函数main(){
const hello=wait asyncFunc(“hello”)
log(你好)
const world=等待异步函数(“世界”)
console.log(世界)
}

main()。此答案旨在强调ECMAScript 2017语言规范(ES8)中引入的新功能

正如您从下面的代码片段中看到的,每个li