2016-11-03 3 views
1

私はそれは要するにこのカスタム解決機能の目的は?

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の繰延オブジェクトの種類を作成するためのショートカットです。彼らはむしろ例えば_createResolvedPromiseのようにそれをより直感的に呼び出すべきだったが、私たちはいつもいくつかの文字を保存するために使用していた。

一般に、この手法は、遅延を返す関数がある場合に必要ですが、場合によっては値を初期値として返すことができます。この場合、呼び出し側は遅延を期待しているため、値を返すことはできません。そのため、遅延オブジェクトを作成して直ちにその値で解決する必要があります。これらの遅延オブジェクトをという定数の遅延オブジェクト程度と呼びます。

applyは、に渡されるオプション引数を使用して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

のように使用されて参照して、ために表示されます...

function _resolve(){ 
    var $deferred = $.Deferred(); 
    return $deferred.resolve.apply($deferred, arguments).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)); 
} 
関連する問題