2016-11-03 51 views
1

我無法令人費解的這一決心的功能了...這個自定義解析函數的目的是什麼?

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

回答

1

_resolve功能是創建樣的虛擬 jQuery的Deferred對象,這是初步解決的快捷。他們應該寧願將它稱爲_createResolvedPromise這樣會更直觀,但我們總是用來保存一些不是我們的角色。

一般來說,當你有一個返回延遲的函數時,需要使用這種技術,但在某些情況下,你可以提前返回一些值。在這種情況下,你不能只返回值,因爲調用者期望延遲,所以你必須創建一個延遲對象,並立即用該值來解析它。你也許可以把這些延期對象稱爲等待延期的對象左右。

apply用於使用傳遞給_resolve的可選參數調用resolve。這些參數稍後將傳遞給done回調。請參閱文檔here

在延遲對象上調用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 
}); 

希望它是有道理的。

0

總之,這似乎是以Promise /異步方式包裝各種呼叫。

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)); 
} 
相關問題