1

店舗ロケーターを構築し、require を介してカスタム モジュールをロードしています。カスタム モジュールは、Microsoft のルート案内と検索モジュールに依存しています。私はコールバック地獄が嫌いで、モジュールをプリロードして、すべてがロードされたらカスタム モジュールでプロミスとアクションを返したいと考えています。

Promise仕様にブルーバードを使用し、いくつかのアプローチPromise.methodを試しましたが、どれも機能していないようです。Promise.promisifynew Promise(function(resolve, reject){Microsoft.Maps.loadModule({callback:resolve})})

私の最新の実装:

function loadSearch() {
            var resolver = Promise.defer();
            Microsoft.Maps.loadModule('Microsoft.Maps.Search', {
                callback: resolver.resolve
            });
            return resolver.promise;
        } /* end loadSearch */ 

        function loadDirections() {
            var resolver = Promise.defer();
            Microsoft.Maps.loadModule('Microsoft.Maps.Directions', {
                callback: resolver.resolve
            });
            return resolver.promise;
        }

Promise.all([loadSearch(), loadDirections()], function() {
        //do something
    });

その結果Uncaught TypeError: Cannot read property '_tryFollow' of undefined bluebird.js 、最新のコードまたはプロミス形式でモジュールをロードする疑似コードの例の明らかなエラーを誰でも指摘できますか。

4

1 に答える 1

0

まず第一にPromise.all、Bluebird ではそのような 2 番目の引数を受け入れず、promise を返します。

Promise.all([loadSearch(), loadDirections()]).then(function(results) {
    //do something
});

またはそれ以上

Promise.all([loadSearch(), loadDirections()]).spread(function(search,dirs) {
    //do something
});

次に、 defer のメソッドは defer インスタンスにバインドされていません (JS には動的な this があります)。代わりに promise コンストラクターを使用します。

function loadDirections() {
    return new Promise(function(resolve){
        Microsoft.Maps.loadModule('Microsoft.Maps.Directions', {
             callback: resolve // since this is not a method this is not bound
        });
    });
}

等々。一般に、Bluebird では遅延インターフェースよりも promise コンストラクターを優先する方が適切です。

合計で:

function loadSearch() {
    return new Promise(function(resolve){
        Microsoft.Maps.loadModule('Microsoft.Maps.Search', {
            callback: resolve
        });
    });
} 
function loadDirections() {
    return new Promise(function(resolve){
        Microsoft.Maps.loadModule('Microsoft.Maps.Directions', {
            callback: resolve
        });
    });
}
Promise.all([loadDirections(),loadSearch()]).spread(function(dir,search){
     //both done, results here
});

それだけの価値はありますが、問題を提起したところです。Bluebird の将来のバージョンでは、より適切なエラー メッセージが表示される予定です。

于 2014-04-22T20:37:29.887 に答える