2017-03-13 18 views
3

私のプロジェクトでは、異なる引数で異なる種類の関数を持つシナリオがあります。これらの引数の1つにコールバック関数があります。また、関数に引数がない場合もあります。以下に示すように:関数の引数に関係なく約束を返すラッパー関数

abc(string, function, number) 
aaa(function, string) 
bcd() 
xyz(function) 
cda(string, number, function, string) 

Iにかかわらず、上記の機能の不規則性の、機能が約束を返すべきであることを、このような機能を記述する必要があります。

例:

// Assume $q has been injected 
var defer = $q.defer(); 
function returnPromise(functionName, functionArgumentsInArray){ 
    defer.resolve(window[functionName].apply(null, functionArgumentsInArray)); 
    return defer.promise; 
} 

あなたが見ることができるように、上記の関数は、コールバック関数が、単に機能を解決しません。

注:関数には、最大で1つの関数引数またはなしがあります。

私は次のようにそれぞれのケースごとに個別に行うことができます知っている:

function returnPromise(){ 
    var defer = $q.defer(); 
    abc("hey", function() { 
     defer.resolve(arguments); 
    }, 123); 
    return defer.promise; 
} 

しかし、私はそのようなすべての機能のための共通のラッパーを探しています。

+0

パラメータのどれがコールバックを受け取るかを知ることができない場合は、汎用ラッパーを記述することもできません。 – Bergi

+0

@Bergi私は関数型を調べるために引数と型を使って何かを行うというわずかな考えがあります。しかし、次に何をするか分からない。 –

+0

関数をラッピングするときに引数はまだありません。ラッパーが呼び出されると、コールバックは省略されます。もしあれば、それがどの位置にあるかを知る機会はありません。 – Bergi

答えて

3

私はあなたがHow do I convert an existing callback API to promises?を見ても

const abcPromised = wrap(abc); 
abcPromised("hey", cbPlaceholder, 123).then(…) 

としてそれを使用することができ

const cbPlaceholder = Symbol("placeholder for node callback"); 
function wrap(fn) { 
    return function(...args) { 
     return $q((resolve, reject) => { 
      function nodeback(err, result) { 
       if (err) reject(err); 
       else resolve(result); 
      } 
      for (var i=0; i<args.length; i++) 
       if (args[i] === cbPlaceholder) { 
        args[i] = nodeback; 
        break; 
       } 
      const res = fn.apply(this, args); 
      if (i == args.length) // not found 
       resolve(res); 
     }); 
    }; 
} 

のようなものを探していると思います。一般的には、すべての約束された関数が規約に従ってコールバックを最後のパラメータとして受け取ったときに、プレースホルダのことは必要ありません。

+0

ありがとうございます。私は一度私はコードを理解して受け入れる:) –