私は、コールバックまたは約束を持つ実装を持つことができる非同期認証ハンドラを用意しようとしています。スコープは、常に約束を返すためにこの関数をラップすることです、それで、私はそれをさらにコールバック/約束には無関係に使うことができます。常に約束を返すためにcallback/promise実装でjavascript関数を作成する
誰かがこれらのシナリオに助けを与えることができれば、私は最も感謝しています。その例の1つは実生活です。
機能がある場合はどうのようなもの:
function getData(id, callback) {
var deferred = Q.defer();
apiCall('/path/to/id', function (err, data) {
if (err) deferred.reject(new Error(err));
//do something with data
deferred.resolve(processedData);
}
deferred.promise.nodeify(callback);
return deferred.promise;
}
と、私はこのよう
function myProcessedDataFunction(id) {
return Promise.fromCallback(function (callback) {
return getData(id, callback);
}, {multiArgs: true});
}
この作品はウィルで.fromCallbackを使いたいですか? myProcessedDataFunctionは正しい約束を返しますか?
現実世界の例は次のとおりです。
私がまたはコールバック関数で実装されていない場合があります、そして同時に約束を使用して実装することができ、認証ハンドラを持っています。真偽値を返す可能性があります。
function authHandlerImplementation1(username, password) {
return (username === 'validUsername' && password === 'validPassword');
}
function authHandlerImplementation2(username, password, callback) {
apiCall('/path/to/authorization', function (err, result) {
if (err) return callback(err, null);
callback(null, result);
});
}
function authHandlerImplementation3(username, password) {
return new Promise(function (reject, resolve) {
apiCall('/path/to/authorization', function (err, result) {
if (err) return reject(err);
resove(result);
});
});
}
function authHandlerImplementation4(username, password, callback) {
var deferred = Q.defer();
apiCall('/path/to/id', function (err, data) {
if (err) deferred.reject(new Error(err));
//do something with data
deferred.resolve(processedData);
}
deferred.promise.nodeify(callback);
return deferred.promise;
}
私は5番目のブルーバードの実装を試みます。
function authHandlerImplementation5(username, password, callback) {
return apiCall('/path/to/id', callback).asCallback(callback); // I hope this is the right way to do it (correct me if I'm wrong, please)
}
私のcheckAuth関数はauthHandler実装を使用しており、コールバック/約束には依存したくありません。
function checkAuth(username, password) {
var self = this;
return Promise.fromCallback(function(callback) {
return self.authHandler(username, password, callback);
}, {multiArgs: true});
}
場合authHandlerImplementationは(implementation1)、checkAuthのハングは、何も起こりません、私のテストが失敗した(単に値を返す)コールバックを使用していません。
任意の種類のauthHandler実装を約束(単純な戻り値、コールバックまたは約束の実装)にラップすることができるBluebirdメソッドはありますか?
私は、約束とコールバックスタイルの機能を混ぜるのは良い考えではないと思います。私はそれをつけることがずっと良いと思うし、機能をエントリー時の好みのものに変換する。その理由は、関数がコールバックを使用するかどうかを判断することは不可能だからです。 'authHandler'が同期で、即値が未定義を返す場合はどうなりますか?ところで、bluebirdの 'fromCallback'はコールバックスタイル関数でのみ動作します。 –
私はあなたがコールバックか約束を(どちらかというとうまくいけば)選ぶことを強くお勧めします。両方をサポートすることはここでは面倒で、コールサイトでサポートされています。私が働いている男は、両方の方法をサポートしている非常に多くのコードを書いており、メンテナンスの地獄に変わった。これをJust-Promisesの実装に置き換えると、LoCが半分になり、コードをもっと理解しやすくなりました。 – Bojangles
私はあなたの立場を理解しており、簡潔にするために異形の1つに固執することに同意します。反対側では、私はどちらかを使用する自由をエンドユーザに与えたい。実装スタイルを強制しないことは、これで達成しようとしていることです。 @TamasHegedus基本的な質問の1つは、あなたが述べたとおりです。関数がコールバックまたは約束を使用しているのか、それともどちらも使用していないのか、どのように把握できますか? コールバックで実装された関数の '' fromCallback''は '' 'only'''であることが分かりました。私はそれが有望なスタイル機能をサポートしていると思った。 これを行う方法がある場合は、アドバイスをお願いします。 –