jqueryajax-使用承诺/延迟对象来处理同一ajax调用的不同回调? 考虑下面的场景:
我想在我的电子商务脚本中多次检查产品的库存可用性 我所做的是jqueryajax-使用承诺/延迟对象来处理同一ajax调用的不同回调? 考虑下面的场景:,jquery,ajax,promise,Jquery,Ajax,Promise,我想在我的电子商务脚本中多次检查产品的库存可用性 我所做的是 var checkStock = function(id) { $.ajax({ type: "POST", dataType:'json', url: "class/updateCart.php", data: { productID: id, action: 'checkStock' } }).done(function(data) { return parseInt(data.stock)
var checkStock = function(id) {
$.ajax({
type: "POST",
dataType:'json',
url: "class/updateCart.php",
data: { productID: id, action: 'checkStock' }
}).done(function(data) {
return parseInt(data.stock);
}).fail(function(data) {
return 'AJAX FAILED';
});
}
所以现在我想这样使用它:
if(checkStock(productID) == 0) {
// do something (A)
}
这显然不起作用,所以在我的研究中,我发现:
&
对延迟的目标/承诺有很好的解释。
但不知何故,我看不出两者之间的区别
var checkStock = function(id) {
$.ajax({
type: "POST",
dataType:'json',
url: "class/updateCart.php",
data: { productID: id, action: 'checkStock' }
}).done(function(data) {
// DO SOMETHING (A)
}).fail(function(data) {
// DO SOMETHING (B)
});
}
和(延迟对象方式)
这两个选项仅允许我在每次函数成功时执行某项操作(A)
。但我想检查一下库存情况,然后根据结果做不同的事情
例如,在我的代码中,我执行以下操作:
if(checkStock(productID) == 0) {
// do something (A)
}
在别的地方我做了一些完全不同的事情
if(checkStock(productID) > 5) {
// do something completely different
}
因此,我的问题是:
使用承诺的意义在于允许您将回调与原始操作分离(通过返回承诺),并链接多个异步操作 您需要将代码移动到promise回调中:
checkStock(productId)
.then(function(result) {
if (result > 5) {
...
}
});
每次调用函数时,可以添加不同的promise回调 是的,我意识到这会“解决”它,但这不是我想要的。我的代码需要很多上下文变量。我不想把这些都传递给这个ajax调用。我问这个问题是为了避免这种情况,因为某种程度上延迟对象是作为解决方案销售的(比如同步代码,只是更好)。我还是不知道该怎么做,你不需要。只需将承诺回调放在调用函数中。它可以通过闭包访问所有变量。天哪,我明白了!我所有的问题都得到了回答。非常感谢你。我误解了代码的用法。我以为这是定义回调,但实际上这是定义和执行每次。爱死它了!你真的不能那样做。没有办法以您想要的方式返回ajax调用的结果,除非您同步执行,而您不希望这样做。您必须使用回调或返回一个承诺,在这里您将再次使用回调函数,因此使用额外的承诺并不能解决问题,因为ajax调用已经返回了一个承诺。
checkStock(productId)
.then(function(result) {
if (result > 5) {
...
}
});