2016-11-30 3 views
1

Я пытаюсь перебрать массив обещаний первого умножения всех значений в массиве на 2 THEN возвращая обновленный массив:Перебора массива с Bluebird обещаниями

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делает.

Fiddle: 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; 
    })); 
    } 
Смежные вопросы