2013-07-31 6 views
15

すべての引数を渡すのに問題があります。私の約束コールバックは、3つではなく1つだけを受け取ります:javascriptがすべての引数を渡すことを約束しない(Qを使用)

var asyncFunction= function(resolve) { 
    setTimeout(function() { 
     resolve("Some string that is passed", "and another", "third"); 
    }, 1000); 
}; 

var promiseFunction = function() { 
    var deferred = Q.defer(); 

    asyncFunction(deferred.resolve); 

    return deferred.promise; 
}; 

promiseFunction().then(function() { 
    // Only one argument is passed here instead of 3 
    // { '0': 'Some string that is passed' } 
    console.log(arguments); 
}); 

私は間違って何をしていますか?

+0

私のお金はタイプ強制です –

答えて

12

Q約束は1つの議論しか持たないresolve dであることができます。約束は単一の値を表し、それらの集合を表すわけではありません。複数の値が必要な場合は、明示的に配列に入れてください。複数パラメータコールバックの場合は、.spread()を使用できます。

+1

どのように可能ですか?複数の引数を返す非同期関数を持つ何千ものライブラリがありますか?彼らはそれから使用できませんか? – Nick

+0

ラッパーでしか見えません。あなたは特別なことを念頭に置いていますか? – Bergi

+0

@Nickライブラリ全体は、単一価値アプローチを中心にしています。 [ソースを見てください](https://github.com/kriskowal/q/blob/424dbd1f8c4a6a40a4b2c341598955b3880bfe79/q.js#L571)、複数の値をサポートするために必要な変更を見つけようとします。実際の価値がほとんどまたはまったく返ってこないうちに、この複雑さがどんなに複雑になるかは驚かれるでしょうBergiが示唆するように、配列を使用します。 – Tomalak

2

同期関数は1つの値だけを返します。非同期の場合と同じ方法で解決します。

多くの値で解決する非同期関数を作成することは悪い習慣です。多くの値を渡したい場合は、arrayまたはdictオブジェクトでそれらを返します。与えられた関数が同期している場合と同じです。

+1

コールバックを使用するライブラリがたくさんあります。私はこの悪い習慣を考慮しない。複数の価値を支持する約束/先物も論理的なステップのようです。私は、この[メーリングリストのエントリー](http://lists.w3。org/Archives/Public/www-dom/2013AprJun/0059.html)。 – Matt

+0

Matt、最初は図書館で私は解像度のために複数の値を許容して実験を続けましたが、すぐにその考えを拒否しました。私は今正確な問題を覚えていませんが、解決された値を1つのオブジェクトとして扱う必要があるケースがあり、配列や引数オブジェクトを常に処理するのは変です(同期関数と同じではない) 。 決定はすでに作成されており、実際に正しいと証明されています。あなたが見たようにリンクした投稿はすばやく表示されました。私はそのような考えが真剣に検討されていることを覚えていない。 –

+0

私は約束の図書館(楽しく学んでいる)を書いていて、複数の解決の議論が私にこのような自然な解決策のように感じているので気にします。コミュニティーが単一の価値に決着をつけているとすれば、私はそう仮定します。フォローアップをありがとう。 – Matt

0

複数の値を渡す場合は、配列やオブジェクトなど、渡した別の値でラップする必要があります。

関連する問題