【问题标题】:How to resolve inside last then() call如何在最后一个 then() 调用内部解决
【发布时间】:2015-11-23 01:51:07
【问题描述】:

我有一个函数,它需要一个应该用 3 个参数解析的承诺。

问题是返回promise的函数必须等待另一个deferred

function load(){
  var d = $.Deferred();

  this.getData().then(function(){
    ....
    d.resolve(1, 2, 3);
  });

  return d.promise();
}


load().then(function(a, b, c){
  ....
});

有什么方法可以使用 getData() 已经返回的承诺并避免创建另一个延迟对象?问题是 getData 返回的承诺在 then() 被调用之前解决了,我不知道如何用新参数再次解决它

【问题讨论】:

  • 如果getData 已经返回的promise 不能用(1, 2, 3) 实现,那么你不能使用它——一个promise 只能被解决一次。为此创建一个新的 deferred 并没有错,但是它应该看起来 like this 而不是使用 deferred antipattern

标签: javascript jquery promise


【解决方案1】:

您不需要正在创建的额外延迟。只需从外部函数返回您已经拥有的承诺,然后从 .then() 处理程序中返回一个值。您从 .then() 处理程序中返回的值将成为返回的承诺的新解析值。这是承诺链,你可以这样实现它:

function load(){
  return this.getData().then(function(){
    ....
    return [1, 2, 3];
  });
}


load().then(function(array){
    console.log(array);    // [1,2,3]
});

仅供参考,请注意,我将返回值更改为值数组,因为您只能从函数返回单个值/对象。这意味着 load().then(...) 中的值将是该数组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多