0

引数が何であるかわからないので、ノードに非同期コールバックを実装する方法を考え出そうとしています。

これを明確にするために、私がやろうとしていることの同期バージョンを述べます。

function isAuthorized(userID){
    // check for user Permissions here
    return isAuthorized;
}

これを使用すると、任意の関数でそれを呼び出すことができ、返される値から、ユーザーが承認されているかどうかを判断できます。ただし、ユーザー ID を取得する (およびアクセス許可を確認する) ために使用する関数は、両方とも非同期関数であり、コールバックを必要とします。ただし、コールバックで必要な引数がわからない場合、これを実装する方法がわかりません。

これを呼び出す関数は、コールバックにいくつかの引数を送信する必要がある可能性があり (通常は、同期して返されるのを待つだけです)、それが私を混乱させています。

function isAuthorized(socket, callback, args){
    socket.get('userID', function (err, userID) {
        //check userID for permission
        callback(args);
    });
}

引数を配列に変換してその配列を送信できることはわかっていますが、すべてのコールバックを引数の配列から変換する必要がない、より一般的な方法があるかどうかを知りたかったのです。

あなたが助けてくれることを願っています、Pluckerpluck

4

5 に答える 5

1

したがって、API を作成するときは、引数がコールバックに渡される順序を指定します。そのため、API を使用するすべての人がメソッドから返される内容を理解できるように、コードに適切なコメントを付ける必要があります。

渡されたコールバック関数がどのように見えるかに応じて、おそらく異なる引数を返したいと思っているようです。これは従来の API の仕組みではありません。それを効果的に行うには、かなりの時間がかかります。

オブジェクトをコールバックに渡すことをお勧めします。オブジェクトは、人々がそれから引き出すことができる複数の引数を持つことができます。これにより、メソッドの全員の実装を台無しにすることなく、そのオブジェクトに追加のプロパティを非常に簡単に追加できるため、将来の拡張が容易になります。したがって、次のようなものを返します。

{
    "id": "Some_ID",
    "message": "Some Message",
    "isAuthorized" : true
}

このように、API を使用する人は、コールバック メソッドで複数の引数を考慮する必要がありません。彼らは、引数を 1 つだけ取得すること、それが複数のプロパティを持つ Obj になること、必要なプロパティを消費できることを知っています。さらに、将来的には、コードを壊さずに 4 番目または 5 番目のプロパティを追加できます。「datetime」プロパティを追加でき、そのコードは変更されません。下位互換性が得られるため、新しい実装者は新しいプロパティを使用できます。

于 2012-05-10T15:32:47.800 に答える
1

arguments私があなたを正しい方法で理解しているかどうかはわかりませんが、関数内のオブジェクトを探しているようです( MDN リンク)。

基本的にこの方法では、事前にパラメーターを指定する必要はありませんが、存在するパラメーターを関数に検索させます。したがって、次のようなことができます。

function myFunc() {
  for (var i=0; i<arguments.length; ++i ) {
    console.log( arguments[i] );
  }
}

その結果、次のような出力が得られます

myFunc( 1 );
> 1
myFunc( 's', 3, 'S' );
> "s"
> 3
> "S"
于 2012-05-10T15:28:06.243 に答える
1

これらの引数を配列にプルする関数をいつでも作成して、各非同期関数で再利用できます。

function asyncWithCallbackArgs(obj, callback) {
  var args = Array.prototype.slice.call(arguments, 2);
  callback.apply(obj, args);
}

これにより、次のようなことができるようになります。

function callback (c, d, e, f) {
  console.log([c, d, e, f]);
}

asyncWithCallbackArgs({}, callback,'c','d','e','f');​

ここで遊ぶためのフィドルがあります。

于 2012-05-10T15:28:36.610 に答える
0

Coffee-script には、splats と呼ばれるものがあります。

( socket, callback, args... )->

  callback args...

これを Javascript に変換すると、次のようになります。

var __slice = [].slice;

function() {
  var args, callback, socket;
  socket = arguments[0], callback = arguments[1], args = 3 <= arguments.length ?__slice.call(arguments, 2) : [];
  return callback.apply(null, args);
};
于 2012-05-10T15:31:32.670 に答える
0

私があなたを正しく理解しているなら、それらを引数として渡さないでください:

var a = "something";
var b = "something";

var callback = function(){
   // use a and b here
};

isAuthorized(socket, callback);

http://jsfiddle.net/S4tH6/

于 2012-05-10T15:25:54.353 に答える