这个自定义解析功能的目的?

时间:2016-11-03 14:57:33

标签: javascript jquery

我在解决这个解析功能方面遇到了麻烦...

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);
        }

2 个答案:

答案 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));
}