2016-11-30 108 views
1

我想先乘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

當你的代碼中沒有什麼是異步的時候使用promise是沒有意義的! – 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

...解析爲原始數組未經修改的,這種方法是指用於副作用。如果迭代器函數返回一個promise或一個thenable,那麼在繼續下一次迭代之前,等待promise的結果。

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; 
    })); 
    }