我知道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;我错过了什么?
答案 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 };
});
}