2015-06-11 2 views
0

У меня есть некоторый код, как это:Node.js и Q Promises: Как я могу передать параметры более чистым способом?

function example(data){ 
    asyncFnOne() 
     .all([asyncFnTwo(), data]) 
     .spread(asyncFnThree) 
     .done(); 
}; 

Это не имеет значения, что эти функции делают. Проблема заключается в том, что я не знаю, как asyncFnThree может получить доступ к данным asyncFnTwo и от параметров функции. То, как я решил проблему, не очень читаемо. Есть ли рекомендуемый способ сделать это чистым способом?

Второй возможный soultion бы

function example(data){ 
    asyncFnOne() 
     .then(asyncFnTwo) 
     .then(function(result){ 
      asyncFnThree(result, data); 
     }) 
     .done(); 
    }; 
}; 

Но я думаю, что это еще менее читаемым.

+0

Вы имели в виду 'Q.all ([asyncFnOne(), data]). Spread (asyncFnTwo) .done()'? Насколько я знаю, Q-обещания не имеют метода '.all()', и, конечно же, никто не принимает функции обратного вызова * и *. – Bergi

+0

Да, вот что я имел в виду. Сожалею. – Josh

+0

Обратите внимание, что ваш второй фрагмент совсем другой, он ждет с вызовом 'asyncFnTwo (...)' для первого обещания и передает его значение, в то время как ваш первый фрагмент вызывает 'asyncFnTwo()' немедленно и без аргументов. Какое поведение вы хотите? – Bergi

ответ

0

Чтобы использовать Q.all желаемым образом вы должны сделать следующее:

function example(data) { 
    return Q.all[ 
     asyncFnOne().then(asyncFnTwo), 
     data 
    ]).spread(asyncFnThree); 
} 

Или использовать переменную для первой части цепи, так что вам не нужно набивать все в одном выражении и использовать return Q.all([promiseTwo, data])….

Альтернативный способ с закрытием полностью прекрасен, а также является стандартным. Вы также можете использовать любую библиотеку, которая предлагает какое-то частичное приложение, и использовать это вместо выражения функции.

function example(data) { 
    return asyncFnOne() 
    .then(asyncFnTwo) 
    .then(asyncFnThree.bind(null, data)); // argument order to asyncFnThree: data, result 
} 
0

Вы можете использовать переменные в качестве буферов или создавать обещания «среднего человека». Вы можете найти несколько хороших примеров здесь: http://pouchdb.com/2015/05/18/we-have-a-problem-with-promises.html?utm_source=javascriptweekly&utm_medium=email

+0

Спасибо за ссылку, я нашел там кое-что интересное. Что вы подразумеваете под переменными в качестве буферов? – Josh

Смежные вопросы