如何处理同步和异步jQuery承诺/延迟与"同时#34;并导致不同的格式?

时间:2015-04-08 13:04:56

标签: jquery promise jquery-deferred

我知道jQuery有一个方法.when(),它可以异步和同步工作。

如果传递.when() jQuery promise / deffered它将是异步的,.then().done() etc处理程序将传递promise / deferred,并且将包含异步数据格式。

如果.when()传递了任何其他内容,它将是异步的,.then().done()等处理程序将传递您传递给的确切对象(或其他任何内容)。

现在通常你可以自己定义同步对象,但异步对象并不总是如此,例如可以从某些第三方Web服务器返回。

这样做是为了让你以某种方式转换某些数据,有时候你可以使用逻辑在本地进行转换,但有时候如果你的本地内容可以使用,那么你需要调用它。 ; t自己管理。

无论哪种方式,您都可以通过回调将结果传递给其余代码。

"正确的"如何以统一的方式处理这两种数据?

我想我可以将我的同步对象看作远程服务器返回的对象,但那个"闻起来很糟糕"。

或者回调中的代码可以"嗅探"它可以看到它是哪种类型的数据,但也有#34;闻起来很糟糕"。

如果这看起来太简单,想象一下可能会调用多个第三方服务器中的任何一个,每个服务器返回不同的格式。

这就是事情:

$.when(getSyncOrAsync(7)).done(function(obj) {
  // check if 'obj' is in our format
  // check if it's in one.com's format
  // check if it's in two.com's format
  // code smell? how can we get here after normalizing the formats
  // ... or something? ...
});

function getSyncOrAsync(x) {
  if (x < 3) {
    // we can do it ourselves - return an object directly
    return { some: 'very', simple: 'object' };
  } else if (x < 6) {
    // we need to call site number one - return a promise/deferred
    return $.get('http://one.com#' + x);
  } else {
    // we need to call site number two - return a promise/deferred
    return $.get('http://two.com#' + x);
  }
}

还有第三种方式我现在太傻了吗?它是否涉及在promise / deferred管道中增加额外步骤的技巧?这似乎效率低下但不那么有气味#34;我错过了什么?

1 个答案:

答案 0 :(得分:2)

.then请求上使用$.get将结果转换为您预期的格式,以便您的承诺回调不必具有该逻辑。

getAsync(7).done(function(obj) {
  console.log(obj.some); // always works
});

function getAsync(x) {
  if (x < 3) {
    // we can do it ourselves - return a new promise resolved with object
    return $.when({ some: 'very', simple: 'object' });
  }
  if (x < 6) {
    // we need to call site number one - return a promise/deferred
    return $.get('http://one.com#' + x).then(function (result) {
      return { some: result.foo, simple: result.bar };
    });
  }
  // we need to call site number two - return a promise/deferred
  return $.get('http://two.com#' + x).then(function (result) {
    return { some: result.apple, simple: result.banana };
  });
}