【问题标题】:jquery promise function chainingjQuery Promise 函数链接
【发布时间】:2020-12-06 00:05:51
【问题描述】:

我正在尝试创建一系列链接在一​​起的函数。以下是我想要的,但我希望能够单独调用任何函数来启动序列。例如,如果我调用 one(),它将运行 one(),然后是 two(),然后是 three(),然后是 complete()。如果我调用three(),它将运行三个然后完成()。有没有一种方法可以将每个函数“链接”到它下面的函数而不像 one().then(two).then(three).then(complete); 那样调用它,而是只调用一个()或两个()等?

function one() {
    var d = $.Deferred();
    
    console.log('one');
    setTimeout(function() {
        d.resolve();
    }, 5000);
    
    return d.promise();
}

function two() {
    var d = $.Deferred();
    
    console.log('two');
    setTimeout(function() {
        d.resolve();
    }, 5000);
    
    return d.promise();
}

function three() {
    var d = $.Deferred();
    
    console.log('three');
    setTimeout(function() {
        d.resolve();
    }, 5000);
    
    return d.promise();
}

function complete() {
    
    console.log('done');
}

one().then(two).then(three).then(complete);

【问题讨论】:

  • 如果函数是同步的并且不使用 Promise,你将如何解决同样的问题?

标签: jquery promise deferred


【解决方案1】:

假设顺序始终相同,只需在每个顺序中添加一个 then() 并在其中依次调用下一个。

function one() {
    var d = $.Deferred();        
    console.log('one');
    setTimeout(d.resolve, 1000);       
    return d.promise().then(two);
}

function two() {
    var d = $.Deferred();    
    console.log('two');
    setTimeout(d.resolve, 1000);    
    return d.promise().then(three);
}

function three() {
    var d = $.Deferred();    
    console.log('three');
    setTimeout(d.resolve, 1000);    
    return d.promise().then(complete);
}

function complete() {    
    console.log('done');
}

one();
setTimeout(()=>{console.log('Start at three'); three()}, 5000)
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

【讨论】:

  • 是的,这就是我想要的。顺序将始终相同。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-18
  • 2020-02-18
  • 2019-01-15
相关资源
最近更新 更多