20

現在、コア ファイルで promise.deferred を使用しています。これにより、中央の場所でプロミスを解決できます。アンチパターンを使用している可能性があることを読んでいて、なぜそれが悪いのかを理解したいと思っています。

私のcore.jsファイルには、次のような関数があります。

var getMyLocation = function(location) {    
    var promiseResolver = Promise.defer();

    $.get('some/rest/api/' + location)
        .then(function(reponse) {
            promiseResolver.resolve(response);
        )}
        .catch(function(error) {
            promiseResolver.reject(error);
        });

     return promiseResolver.promise;
}

そして、私のgetLocation.jsファイルには次のものがあります。

var core = require('core');
var location = core.getMyLocation('Petersburg')
    .then(function(response) {
        // do something with data
    }).catch(throw error);

ブルーバードのドキュメントと遅延アンチパターンに関する多くのブログ投稿を読んだ後、このパターンが実用的かどうか疑問に思います。これを次のように変更できます。

core.js

var getMyLocation = function(location) {
    var jqXHR = $.get('some/rest/api/' + location);
    return Promise.resolve(jqXHR)
        .catch(TimeoutError, CancellationError, function(e) {
            jqXHR.abort();
            // Don't swallow it
            throw e;
        });

getLocation.js

var location = core.getMyLocation('Petersburg')
    .then(function(response) {
        // do something
    })
    .catch(function(error) {
        throw new Error();
    });

呼び出しにはjqueryを使用し、約束にはBluebirdを使用してxhrリクエストを処理する中央ライブラリを持つ最良の方法は何かに混乱していると思います。

4

2 に答える 2

4

thenable を Bluebird promise に変換するには、次のPromise.resolveように can 呼び出しを使用できます。

var promise = Promise.resolve($.getJSON(...));

ボーナスセクション:

ほとんどの JQuery AJAX 関数は実行可能ですが、参考までに、コールバックを期待する関数をプロミスに変換する場合は、Promise.fromNode. コールバックはerr, result、Node.js の世界の慣習に従って、引数を使用して呼び出されます。

var promise = Promise.fromNode(function (callback) { request(url, callback); });

コールバックが最初の引数の潜在的なエラーを想定していない場合は、次のように回避できます。

var promise = Promise.fromNode(function (callback) {
  FB.api(url, function(response) { callback(response ? response.error : "no response", response); });
});
于 2015-08-24T17:09:35.167 に答える