我如何 return 来自 jQuery 延迟链的值?

How do I return a value from a jQuery deferred chain?

考虑到这个例子,我希望 hello world 会在链条中向上冒泡。虽然某些 Deferred/Promise 框架可以,但似乎 jQuery 不能这样做。

function function1() {
  return function2().done(function(pelle) {
    return "hello world";
  });
}

function function2() {
  return $.Deferred().resolve("function2");
}

function1().done(function(response) {
  console.log("response", response);
});

https://jsfiddle.net/ysbjr1nm/

如何重构此代码以实现此目的?

所以为了说明问题中所述的问题objective是投影返回的承诺以供后续使用。

您需要使用 then() 方法,它允许您 "project" a promise.Before 1.8 您可以使用 pipe() 方法 also.As 使用 pipe() 已从 1.8 开始贬值(参考 https://api.jquery.com/deferred.pipe/)按照@charlietfl 的建议使用 then()

现在,如果您像这样更改代码

function function1() {
  return function2().then(function(pelle) {
    return "hello world";
  });
}

function function2() {
  return $.Deferred().resolve("function2");
}

function1().done(function(response) {
  console.log("response", response);
});

它会导致“response hello world”。

您可以阅读关于相同内容的详尽讨论 http://joseoncode.com/2011/09/26/a-walkthrough-jquery-deferred-and-promise/

已更新 fiddle

function1 中使用了错误的回调方法。你想要 then 而不是 done

Promise 链通过 return 在然后 return 到链中的下一个 then

function function1() {
  return function2().then(function(pelle) {
    return "hello world";
  });
}

DEMO