2016-11-30 42 views
1

私は最初のTHEN更新配列を返す2により、アレイ内のすべての値を乗じて約束の配列を反復処理しようとしています:反復処理

var Bluebird = Promise.noConflict() 
var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9]; 

function loopThroughArray(arr) { 
    return Bluebird.each(arr, function(value) { 
    return value = value * 2; 
    }).then(function(arr) { 
    console.log('--done--'); 
    console.log(arr); 
    // should return [2, 4, 6, 8, 10, 12, 14, 16, 18]; 
    }); 
} 

loopThroughArray(arr); 
しかし

、私の機能がまだ戻っています元の配列..誰かを助けることができますか?ここに私のバイオリンです:事前に

http://jsfiddle.net/mpo4yrmu/71/

ありがとう!

+1

は、おそらくあなたは '.map'が値 - [フィドル]の新しい配列にマップしたいです(http://jsfiddle.net/jaromanda/mpo4yrmu/72/)(約束を使用する点は見当たりません!) –

+0

あなたのコードに何も非同期である場合には、約束を使用することに意味はありませんか? – Bergi

答えて

3

.eachの代わりに.mapを使用してください。

.each.mapです。

フィドル:http://jsfiddle.net/free_soul/mpo4yrmu/73/

var Bluebird = Promise.noConflict() 
var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9]; 

function loopThroughArray(arr) { 
    return Bluebird.map(arr, function(value) { 
    return value = value * 2; 
    }).then(function(arr) { 
    console.log('--done--'); 
    console.log(arr); 
    // does return [2, 4, 6, 8, 10, 12, 14, 18, 19]; 
    }); 
} 

loopThroughArray(arr); 
-1

valueは参考値ではありません。このようなことができますが、配列の値は変更されます。

var Bluebird = Promise.noConflict() 
var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9]; 

function loopThroughArray(arr) { 
    Bluebird.each(arr, function(value, i) { 
    arr[i] = arr[i] * 2; 
    }).then(function(arr) { 
    console.log('--done--'); 
    console.log(arr); 
    // should return [2, 4, 6, 8, 10, 12, 14, 18, 19]; 
    }); 
} 

loopThroughArray(arr); 
1
var Bluebird = Promise.noConflict() 
var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9]; 

function loopThroughArray(arr) { 
    return Bluebird.map(arr, function(value) { 
    return value = value * 2; 
    }).then(function(arr) { 
    console.log('--done--'); 
    console.log(arr); 
    // should return [2, 4, 6, 8, 10, 12, 14, 18, 19]; 
    }); 
} 

loopThroughArray(arr); 

私はここに示したように、あなたの目標を達成するために.mapを使用してください。

なぜ.eachがここで動作しないのですか?

回答:each関数はイテレータです。配列または配列の配列を繰り返し処理します。mapは配列に対して繰り返し処理を行いますが、その本体から戻ってくる値を待って各繰り返しの戻り値を配列に格納します。

その配列は、次にブロックすることができます。

0

Bluebird.each()は元の配列を変更しないため、元の配列を記録しています。

Bluebird.each

...この方法は、副作用のために使用されることを意図され、元の配列に修飾されていない解決します。反復子関数が約束を返す場合、約束の結果を待ってから、次の反復を続行します。

http://bluebirdjs.com/docs/api/promise.each.html

正しい方法は、使用することですのJavascriptのArray.prototype.map()ネイティブ:

//your promise code here 
...function(arr) { 
    console.log('done!'); 
    console.log(arr.map(function(element) { 
     return element * 2; 
    })); 
    }