2015-07-17 6 views
1

В приведенном ниже примере кода вы видите, что у меня есть цепочка функций, которые отображаются, и когда и когда возникает ошибка, цепочка завершается. Значение глобального x установлено на bar из первой функции, но оно не установлено на baz из третьего, потому что оно никогда не запускается.Перерыв обещание карта изнутри значения функции?

var x = "foo" 

Promise.map([ 
    function(){ 
    x = "bar" 
    return true 
    }, 
    function(){ 
    throw new Error() 
    }, 
    function(){ 
    x = "baz" 
    return true 
    } 
], function(fn){ 
    return Promise.method(fn)() 
}) 
.catch(function(e){ 
    console.log(e) // [Error] 
}) 
.then(function(){ 
    console.log(x) // "bar" 
}) 

Однако, когда я открываю обещание внутри функции карты и вставляю условно брошена ошибка x изменяется на baz, а третья функция не выполняется.

var x = "foo" 

Promise.map([ 
    function(){ 
    x = "bar" 
    return true 
    }, 
    function(){ 
    return "bad value throw error" 
    }, 
    function(){ 
    x = "baz" 
    return true 
    } 
], function(fn){ 
    return Promise.method(fn)().then(function(val){ 
    if(val == "bad value throw error") throw new Error() 
    return val 
    }) 
}) 
.catch(function(e){ 
    console.log(e) // [Error] 
}) 
.then(function(){ 
    console.log(x) // "baz" 
}) 

Как я могу вставить ошибку в карту обещаний и выбросить эту ошибку, нарушая цепочку карт?

Есть ли другой метод bluebird, который может запускать ряд обещаний в серии?

+0

Если вы хотите запускать функции в * parallel *, почему вы ожидаете, что они перестанут работать еще до того, как будет сброшена ошибка? – Bergi

+1

Это опечатка, которую я хочу, чтобы они запускались в серии. – ThomasReggi

+0

Да, используйте опцию '{concurrency: 1}'. – Bergi

ответ

0

Ответ на этот вопрос заключается в использовании each вместо map.

var x = "foo" 

Promise.each([ 
    function(){ 
    x = "bar" 
    return true 
    }, 
    function(){ 
    return "bad value throw error" 
    }, 
    function(){ 
    x = "baz" 
    return true 
    } 
], function(fn){ 
    return Promise.method(fn)().then(function(val){ 
    if(val == "bad value throw error") throw new Error() 
    return val 
    }) 
}) 
.catch(function(e){ 
    console.log(e) // [Error] 
}) 
.then(function(){ 
    console.log(x) // "baz" 
}) 
Смежные вопросы