Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/68.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
jqueryajax-使用承诺/延迟对象来处理同一ajax调用的不同回调? 考虑下面的场景:_Jquery_Ajax_Promise - Fatal编程技术网

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
}
因此,我的问题是:

  • 延迟对象和ajax调用的简单.fail/.success回调之间有什么区别
  • 是否可以在不同步ajax调用的情况下执行我想要的操作?我希望使用相同的ajax调用,并根据使用ajax调用的上下文使用不同的结果

  • 使用承诺的意义在于允许您将回调与原始操作分离(通过返回承诺),并链接多个异步操作

    您需要将代码移动到promise回调中:

    checkStock(productId)
        .then(function(result) {
            if (result > 5) {
                ...
            }
        });
    

    每次调用函数时,可以添加不同的promise回调

    是的,我意识到这会“解决”它,但这不是我想要的。我的代码需要很多上下文变量。我不想把这些都传递给这个ajax调用。我问这个问题是为了避免这种情况,因为某种程度上延迟对象是作为解决方案销售的(比如同步代码,只是更好)。我还是不知道该怎么做,你不需要。只需将承诺回调放在调用函数中。它可以通过闭包访问所有变量。天哪,我明白了!我所有的问题都得到了回答。非常感谢你。我误解了代码的用法。我以为这是定义回调,但实际上这是定义和执行每次。爱死它了!你真的不能那样做。没有办法以您想要的方式返回ajax调用的结果,除非您同步执行,而您不希望这样做。您必须使用回调或返回一个承诺,在这里您将再次使用回调函数,因此使用额外的承诺并不能解决问题,因为ajax调用已经返回了一个承诺。
    checkStock(productId)
        .then(function(result) {
            if (result > 5) {
                ...
            }
        });