我在解决这个解析功能方面遇到了麻烦...
function _resolve(){
var $deferred = $.Deferred();
return $deferred.resolve.apply($deferred, arguments).promise();
}
我看到它像
一样被使用 if (availableLanguages.length === 1) {
return _resolve(availableLanguages[0]);
}
和
if (detectedLocale && availableLanguages.indexOf(detectedLocale) > -1) {
// save the locale so the user does not get asked for it again
return _resolve(detectedLocale, true);
}
答案 0 :(得分:1)
_resolve
函数是一个快捷方式,用于创建最初解析的虚拟 jQuery Deferred对象。他们应该比较称之为_createResolvedPromise
,这会更直观,但我们总是习惯于保存一些不是我们的角色。
一般情况下,如果你有一个返回延迟的函数,则需要这种技术,但在某些情况下,你可以提前返回一些值。在这种情况下,您不能只返回值,因为调用者期望延迟,因此您必须创建一个延迟对象并立即使用该值解析它。您也许可以调用这些延迟对象常量延迟对象左右。
apply
用于通过传递给resolve
的可选参数调用_resolve
。这些参数稍后将传递给done
回调。请参阅文档here。
在延迟对象上调用promise()
只不过是将其包装到promise对象中,以便消费者无法调用resolve
。请参阅文档here。
例如,假设我们想要通过ajax检索某些内容,但我们也要缓存结果。
var _cachedResult;
function getResults() {
if (_cachedResult) {
// for THIS line they made the _resolve shortcut, with which I could write _resolve(_cachedResult)
return $.Deferred().resolve(_cachedResult).promise();
}
return $.ajax(...).done(function(result) {
_cachedResult = result;
});
}
来电者可以这样使用它。
getResult().done(function(result) {
// do something with result, which maybe came from the cache
});
希望它有意义。
答案 1 :(得分:0)
简而言之,它似乎是以Promise / async方式结束各种调用。
detectLocale
可能是异步功能,他们正在使用_resolve以同步方式处理它。您的_resolve
函数返回Promise
,这可能是这些返回值正在使用的消费者。
如果你追查它,我希望看到类似的东西:
function getLanguages() {
if (availableLanguages.length === 1) {
return _resolve(availableLanguages[0]);
}
return new Promise(); // or something, unless it's checking for null outside
}
function doSomething() {
getLanguages().then(languages => console.log(languages));
}