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