首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >简单jquery延迟队列

简单jquery延迟队列
EN

Stack Overflow用户
提问于 2015-02-17 07:25:44
回答 3查看 2.5K关注 0票数 0

我有一个同步的方法foo(param)

我希望可以在没有执行实际foo()调用的情况下调用foo(param),直到稍后发生特定事件为止。

它看起来是一个很好的推迟/承诺的候选人,但我肯定做错了什么,因为超时没有任何影响。

日志方法应该返回承诺吗?

代码语言:javascript
复制
var log = function(message) {
    $('#log').append('<p>' + message + '</p>');
};

$(function() {
 
    var q = new $.Deferred();
    
    q.then(log("1"));
    q.then(log("2"));
    q.then(log("3"));
    q.then(log("4"));
    q.then(log("5"));
    q.then(log("6"));
    q.then(log("7"));
    
    setTimeout(function(){
        q.resolve();
    }, 10000);
    
    
});
代码语言:javascript
复制
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="log"></div>

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-02-17 07:27:48

是的,你说q.then(log("..."))的行应该是q.then(function() { log("...") })

您的log函数很好,但是您当前的代码工作方式是,您已经在调用它并将其返回值传递给then函数。这就是为什么您需要创建一个新的函数,延迟稍后将在其解析时调用该函数。

票数 5
EN

Stack Overflow用户

发布于 2015-02-17 07:30:42

当您执行q.then(log("1"));时,它试图将"log("1")“的函数值传递给当时的函数。这是评估函数的原因,这就是为什么您在控制台中看到它们,而不是您想要的。

像这样包装它们,应该可以解决您的问题:

代码语言:javascript
复制
q.then(function() {
    log("1")
});
票数 2
EN

Stack Overflow用户

发布于 2015-02-18 17:40:00

确切地说,你应该写什么完全取决于什么是什么意思“直到一个特定的事件以后”。

可以用两种方式来解释。

用户事件:用户事件(在浏览器中)类似于“单击”或“鼠标切换”。它的发生并不取决于javascript/jQuery中的任何内容,而且可能永远不会发生。但是,通过附加事件处理程序,可以确保如果/当事件发生时,将采取预定的操作过程。

将按以下方式确定日志顺序:

代码语言:javascript
复制
$(selector).on('eventType', function() {
    log("1");
    log("2");
    log("3");
    log("4");
    log("5");
    log("6");
    log("7");
});

异步响应:异步响应是异步进程完成时发生的事件。它的发生取决于(a)启动的过程和(b)最终的完成。同样,完成可能永远不会发生,但比使用用户事件更有保障。一个写得很好的aync过程应该保证完成(成功或失败)。

将按以下方式确定日志顺序:

代码语言:javascript
复制
asyncProcess().then(function() {
    log("1");
    log("2");
    log("3");
    log("4");
    log("5");
    log("6");
    log("7");
});

如您所见,在这两种情况下,log()语句都是直接的顺序代码行。

在这两种情况下,都没有必要建立承诺链,因为log()本身是同步的。但是,如果您想探索Deferreds/允诺的性质,那么异步版本可以编写如下:

代码语言:javascript
复制
asyncProcess()
    .then(log.bind(null, "1"))
    .then(log.bind(null, "2"))
    .then(log.bind(null, "3"))
    .then(log.bind(null, "4"))
    .then(log.bind(null, "5"))
    .then(log.bind(null, "6"))
    .then(log.bind(null, "7"));

// Note that .then() takes functions as arguments so `.bind(...)` is necessary to establish functions with bound-in arguments, without actually executing `log("1"); log("2"); log("3");` etc at the time the .then() chain is established.

只要asyncProcess()返回承诺:

  • 已经解决了
  • 会在将来的某个时候得到解决,

.then()链中指定的函数将执行,日志中将显示1,2,3,4,5,6,7。

在其最简单的形式中,asyncProcess可能如下所示:

代码语言:javascript
复制
function asyncProcess() {
    return $.when(); //return a resolved promise
}

演示

为了更具冒险精神,并赋予承诺链某种目的,您可以探索它传递数据的能力。

首先,调整asyncProcess()以返回已解析的承诺,并将一个数字作为参数传递给函数:

代码语言:javascript
复制
function asyncProcess(n) {
    return $.when(n);//return a promise resolved with the valie 1
}

然后,调整log()以接受一个数字n,记录它,并返回n+1

代码语言:javascript
复制
function log(n) {
    $('#log').append('<p>' + n + '</p>');
    return n + 1;
}

并将承诺链调整如下:

代码语言:javascript
复制
asyncProcess(1)
    .then(log)
    .then(log)
    .then(log)
    .then(log)
    .then(log)
    .then(log)
    .then(log);

在这里,对.bind()的需求消失了,因为使用原始log时没有任何绑定参数。log的每个调用中的参数由上一次调用的返回值提供。

演示

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28556723

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档