2016-06-28 4 views
0

約束ライブラリをサポートしていて、Bluebirdが指定されていることを知りたいライブラリについては、どのように検証する必要がありますか? - シンプルで信頼性の高いだろうBluebird検出


var promise = require('any-promise-library'); 

function isBluebird(lib) { 
    // do the checks 
} 

console.log(isBluebird(promise)); 
+0

あなたはそのチェックが必要なのですか? –

+0

ライブラリのいくつかの特別な機能を使用することは明らかです。 –

+0

** **どのような特別機能**?いくつかの方法?あなたはいくつかの特別な方法が存在することを確認することができます –

答えて

2

_promise0それ以降のバージョンではない可能性がブレークがブルーバード図書館や著者の内部値である

  • そのライブラリは、渡されたオブジェクトがネイティブな約束かblueBirdかをチェックするためにそのプロパティも使います。将来の重大な変更については

    var Blue = require("bluebird"); 
    var promise = new Blue(function() {}) 
    
    function isBluebird(obj) { 
        try { 
         return {}.hasOwnProperty.call(obj, "_promise0"); 
        } catch (e) { 
         return false; 
        } 
    } 
    
    console.log(isBluebird(promise)) 
    

    か、あなたはライブラリをテストしたい場合は...

    var Blue = require("bluebird"); 
    
    function isBluebird(promiseLibrary) { 
        var promise = new promiseLibrary(function() {}) 
    
        try { 
         return {}.hasOwnProperty.call(promise, "_promise0"); 
        } catch (e) { 
         return false; 
        } 
    } 
    
    console.log(isBluebird(Blue)) 
    

    - 著者と接触して下さい - 内部メソッドとしてisAnyBluebirdPromiseは内部にある - それは変更することができますとまたは何らかの理由

  • +0

    最新のBluebirdに 'false'を返します:)ライブラリのルートレベルに' _promise0'というプロパティはありません。 –

    +0

    機能に渡すものは何ですか?オブジェクトを約束する? –

    +0

    私は最初からそれを示しました - ライブラリのインスタンス。そして、この '新しいpromiseLibrary(function(){})'は緩やかな約束を作りませんか? –

    0

    のないあなたがブルーバードへのアクセス権を持っている場合(あなたがそれを必要とすることができた場合にそれがある)

    これは「aPromise」はあなたに利用できるものとしてブルーバード(のバージョン)と同じであることを確認です:

    function isBluebird(aPromise) { // aPromise is the class of Promise, not an instance 
        var B; 
        try { var B = require ('bluebird') } catch(e) {} 
        if (!B) return false; // bluebird must be installed 
    
        return aPromise.getNewLibraryCopy === B.getNewLibraryCopy 
    } 
    

    aPromiseがgetNewLibraryCopyの結果である場合には現在、これも動作します。しかし、それは保証されていません。

    あなたがgetNewLibraryCopyの結果が異なると見ることがしたい場合は、約束のインスタンスをテストしたい場合は、aPromise.then === B.resolve().thenを比較することができaPromise.resolve === B.resolve

    を比較します。しかし、それは修正されていないブルーバードのためだけに機能します。 getNewLibraryCopyの約束は異なるでしょう。