Как связать вместе набор функций, используя обещания и q в node.js? - PullRequest
0 голосов
/ 20 января 2020

У меня есть некоторые динамические c данные, которые должны быть выполнены на нем. Работа должна происходить последовательно. Используя библиотеку Q , я хотел бы создать массив функций и выполнить код последовательно, используя последовательности. Я не могу понять синтаксис для достижения этой цели.

const fruits = ["apple", "cherry", "blueberry"]

function makeFruitPie (fruit) {
  return Q.Promise((resolve, reject) => {
    // Do some stuff here
    resolve(fruit+" pie")

    // Error handling here
    reject(new Error(""))
  })
}

const fruitFuncs = new Array(fruits.length)

for(var i = 0; i < fruits.length; i++) {
  fruitFuncs[i] = makeFruitPie(fruits[i])
}

// Stole this example from the github docs but can't quite get it right.
i = 0
var result = Q(fruits[i++])
fruitFuncs.forEach((f) => {
  result = result(fruits[i++]).then(f)
})

Ответы [ 3 ]

1 голос
/ 20 января 2020

С этими строками

for(var i = 0; i < fruits.length; i++) {
  fruitFuncs[i] = makeFruitPie(fruits[i])
}

вы уже запустите функции и, следовательно, начнется их обработка.

Предполагая, что вы хотите выполнить функции в последовательности, следующее будет более уместно:

// construct the pipeline
const start = Q.defer();
let result = start.promise; // we need something to set the pipeline off
fruits.forEach( (fruit) => {
  result = result.then( () => makeFruitPie( fruit ) );
});

// start the pipeline
start.resolve();


Sidenote: есть собственная реализация Promise , поддерживаемая почти во всех средах . Возможно, стоит подумать о переходе с поддерживаемой библиотекой версии.
1 голос
/ 20 января 2020

Вы можете использовать Promise.all

Promise.all(fruits.map(fruit=>makeFruitPie(fruit).then(res=> res) )).
then(final_res => console.log(final_res))

final_res выдаст вам массив результатов

0 голосов
/ 20 января 2020

вы можете использовать for..of и делать что-то последовательно. что-то вроде этого

const Q = require("q");

const fruits = ["apple", "cherry", "blueberry"];

function makeFruitPie(fruit) {
  return Q.Promise((resolve, reject) => {
    // Do some stuff here
    resolve(`${fruit} pie`);

    // Error handling here
    reject(new Error(""));
  });
}

for (const fruit of fruits) {
  const result = await makeFruitPie(fruit);
  console.log(result);
}

Кстати, также стоит рассмотреть родной Promise вместо использования q

...