2017-01-03 13 views
3
var arr = [1,2 ,3, 4, 5, 6, 67, 8, 10]; 

function f1() { 

    return arr.map(function (member) { 

     console.log(member); 
     return Promise.resolve(member + 2).then((result) => {return result + 2}).then 
     (value => {return value + 1}); 

    }); 



} 

console.log(f1()); 

出力はすべての単一インデックスでPromise { <pending> }の配列です。どうした?私は最後にreturn value + 1が約束を解決したと思ったので、どうして私は保留になっていますか?保留中の約束の配列を得る

答えて

0

あなたは約束の配列を返すされているので、あなたはこのように、それら、する必要があります。

f1().map(x => x.then(console.log)); 
0

それはあなたのコードから期待されています。

.mapから配列を返します。配列内には、それぞれのアイテムに対してPromiseを返します。

値を取得する場合は、代わりにPromise.all(your_array_promise)を返すことができます。

+0

を使用し 'Promise.all'は、「値を取得」しません。それは値が値の配列である約束を生成する。 –

3

コードに問題はありませんが、何が起こるのでしょうか。私が最後にreturn value + 1いいえ、それはreturnそのものではないの約束

を解決し、それがコールバック関数の戻り値との約束を解決しますthen機能です。思った

そして、いや、それは将来で約束を解決します、まだ約束を解決しませんでした。 thenコールバックは常に非同期に呼び出されます。

なぜ私は保留になっていますか?

これらはログに記録されているため、まだ保留中です。彼らはすぐ後に解決されるでしょう。

あなたは結果の配列を記録したい場合は、

Promise.all(f1()).then(console.log); 
+0

'return value + 1'が"約束を解決する "と言うのは非常に混乱します。この特定のOPは、約束について非常に混乱しています。これは、同じ約束を誤解していることを基本的には同じ質問をしている4番目の投稿です。私はこの時点で彼に通じることはできないと思っていますが、できるだけ明確になるように支払うでしょう。返品は約束を解決するのではなく、解決される価値を提供します。 –

+0

@ torazaburo私はこの問題を私に警告してくれてありがとう、私は厄介な用語を修正した。しかし、私は重複投票に同意しない、私はこの特定の質問は、彼がまだコンソールで実現した約束の代わりに '約束{} 'を得ている理由だと思う。 – Bergi

+0

それを修正していただきありがとうございます。私が知る限り、OPの混乱の根は「解決」の意味にある(最初の質問では、彼は実際に「解決された」ということを実際に尋ねた)。彼は約束を解決すれば、それを何とか純粋な価値に変換すると信じているように見えるので、「約束を決める(42)」(x => x)は「42」を記録する。それで、彼は、彼の心の中で、彼は魔法のように純粋な価値に変えるための「当時」のハンドラの「復帰」を期待しているので、一連の価値観ではなく、一連の約束事で終わるのは混乱している。 –