延期函数并确保最终函数接收两个数据

时间:2015-09-29 22:07:10

标签: jquery jquery-deferred

我希望函数displayResults()在呈现值之前获取数据。函数getResultA()和getResultB()使用$ .Deferred。函数getResultB()依赖于getResultA()的结果。

function getResultA() {
  var deferred = $.Deferred();
  .
  .
  .
  .
  deferred.resolve(someValue);
  return deferred.promise();
}

function getResultB() {
  var deferred = $.Deferred();
  .
  .
  getResultA().done(function(someValue) {
    deferred.resolve(someValue);
    return deferred.promise();
  })
}

function displayResults() {
  getResultB().done(function(response) {
    // display the response
  })
}

我的代码是否正确?

1 个答案:

答案 0 :(得分:2)

您的getResultB()promise anti-pattern。您已经从getResultA()返回了承诺。您无需创建新的。你可以退回你已经拥有的那个。

function getResultB() {
  .
  .
  return getResultA().then(function(someValue) {
      // whatever code you want here
      // code here can return a new value, return the value you already have
      // after doing some other operations or can return a new promise that
      // will be added to the chain
      return someValue;
  });
}

然后,您可以按照规划使用getResultB()

function displayResults() {
  getResultB().then(function(response) {
    // display the response
  })
}

注意:我切换到使用.then()而不是.done(),因为这是使用promises编码的ES6标准方式(并且它也适用于jQuery)。因此,随着jQuery更加符合promise标准,或者使用jQuery以外的来源进行编码,您将不必更改代码或样式。