Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/69.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 返回在单击处理程序中使用的承诺_Javascript_Jquery_Ajax_Promise - Fatal编程技术网

Javascript 返回在单击处理程序中使用的承诺

Javascript 返回在单击处理程序中使用的承诺,javascript,jquery,ajax,promise,Javascript,Jquery,Ajax,Promise,我正在尝试从AJAX方法返回承诺,看看如何使用它们使我的代码更易于阅读/实现功能。我当前的场景是使用一个函数getBookIds,该函数向数据库发出一个AJAX调用,以基于其ID返回一本书的标题。表中有五本书和一个锚定标记,其文本属性对应于每本书。我希望在单击所有锚定标记后,启动其他一些奇特的AJAX方法。以下是到目前为止我得到的信息: HTML <a href="#">1</a> <a href="#">3</a> <a href="#

我正在尝试从AJAX方法返回承诺,看看如何使用它们使我的代码更易于阅读/实现功能。我当前的场景是使用一个函数
getBookIds
,该函数向数据库发出一个AJAX调用,以基于其ID返回一本书的标题。表中有五本书和一个锚定标记,其文本属性对应于每本书。我希望在单击所有锚定标记后,启动其他一些奇特的AJAX方法。以下是到目前为止我得到的信息:

HTML
<a href="#">1</a> 
<a href="#">3</a> 
<a href="#">4</a> 
<a href="#">5</a> 
<a href="#">7</a>
这是一个做作的例子,但我很难想象如何将这些承诺融入到我的日常工作中。这仅仅是一个从一开始就利用承诺/延期权力的坏例子吗?似乎我没有使用AJAX上的
success
回调,而是在
done
中汇总了所有逻辑。有没有更好地解决这个问题的建议

我希望在单击所有锚定标记后,启动其他一些奇特的AJAX方法

这听起来像是你希望每次点击都能得到一个承诺,然后你可以把它组合成一个对所有点击的承诺。重点不是使用全局数组,而是使用承诺数组

function getBookIds(data) { … } //ajax function as before

var promises = $('a').map(function() {
    var $this = $(this),
        click = $.Deferred();
    $this.one('click', function() { // click handler
        click.resolve($this.text());
    });

    return click.then(getBookIds); // returns a promise for the ajax result
                                   // after the link has been clicked
}).toArray();

$.when.apply($, promises).then(function fancyAjax() {
     alert('alert message for fancy stuff');
});

()

这是一个很好的问题,但它属于:@JohnStrickler不是所有带有代码的问题都属于codereview。他询问的是一个概念,代码是一个示例,而不是生产代码。这个问题是关于这里的主题,甚至不是一个坏问题:)@JohnStrickler我也在那里发帖,我很高兴将其迁移到最合适的位置。值得一提的是,promise数组的聚合是使用jQuery中的
$和
promise来完成的。所有的
都在更严肃的promise库中,如Bluebird中。@Bergi如果要使其尽可能灵活,我需要一个接受jQuery数组的函数(在这个类中,锚定标记)并为每个索引创建一个承诺,然后检查每个索引的状态以查看它们是否已解决?@wootscootinboogie:Yes(正如我的示例代码中的
映射所做的那样)不,您不需要手动检查承诺状态。正如Benjamin提到的,您可以使用来聚合它们。@wootscootinboogie:只执行一次处理程序,即不再需要时(当承诺已经实现时),它会自动解除绑定@约翰:不,没有缺陷。返回的不是点击解决的
点击延迟,而是由
然后
-构建的承诺,它将ajax函数链接到解决中。这些承诺与ajax响应一起解决。谢谢你的摆弄,我用我的代码更新了它,包括一些日志:!
function getBookIds(data) { … } //ajax function as before

var promises = $('a').map(function() {
    var $this = $(this),
        click = $.Deferred();
    $this.one('click', function() { // click handler
        click.resolve($this.text());
    });

    return click.then(getBookIds); // returns a promise for the ajax result
                                   // after the link has been clicked
}).toArray();

$.when.apply($, promises).then(function fancyAjax() {
     alert('alert message for fancy stuff');
});