Как вернуть обещание при передаче массива функций другой функции в качестве аргументов?

#javascript #node.js #asynchronous #promise

#javascript #node.js #асинхронный #обещание

Вопрос:

Вопрос можно найти здесь:

Реализуйте getInParallel функцию, которая должна использоваться для параллельного вызова нескольких вызовов API. Функция принимает массив функций , которые возвращают a Promise . Функция должна возвращать a Promise , который должен преобразовываться в массив результатов из аргумента apiCalls.

Например, вызов следующего кода должен выводить [ 'First API call!', 'Second API call!' ] :

 let promise = getInParallel([() => Promise.resolve("First API call!"),
                         () => Promise.resolve("Second API call!")]);
if(promise) {
  promise.then((result) => console.log(result)).catch((err) => console.log(err));
}
 

Это мое решение:

 function getInParallel(apiCalls) {
  // extract function one by one from array
  // then return each function's Promise to 'rFunt' as Promise.all only accepts array, iterable of promises as an input
  let rFunt = apiCalls.map((funct) => {
    return funct()
  })
  return Promise.all(rFunt).then((res) => {
    return res
  })
}

let promise = getInParallel([() => Promise.resolve("First API call!"),
() => Promise.resolve("Second API call!")]);
if (promise) {
  promise.then((result) => console.log(result)).catch((err) => console.log(err));
}
module.exports.getInParallel = getInParallel;
 

Существуют ли какие-либо другие способы / концепции для решения этой проблемы?

Комментарии:

1. В чем проблема с вашим текущим кодом, с которой вам нужна помощь?

2. К вашему сведению, if (promise) это не обязательно, поскольку getInParallel() всегда возвращает обещание. Это .then((res) => { return res }) также не обязательно и ничего не добавляет, поскольку обещание уже разрешено res .

3. @jfriend00 я не сталкиваюсь с какой-либо проблемой, но я хотел бы знать другие методы решения или альтернативы!

4. Этот код можно было бы немного очистить, как я отметил в моем предыдущем комментарии, но это основной способ, которым вы это делаете. Здесь больше нечего добавить.

Ответ №1:

Ваш ответ довольно прост и, возможно, самый простой.
Я перепишу getInParallel , как показано ниже (обычно нам нужна проверка типов, здесь опущена)

 const parallel = funcs => Promise.all(funcs.map(fn => fn()));
 

Ответ №2:

Ваше решение довольно близко, но требует некоторых изменений. Пожалуйста, проверьте приведенный ниже код:

 function getInParallel(apiCalls) {
  // Write your code here
  let functions = apiCalls.map(apiCall => apiCall());
  return Promise.all(functions).then(response => response);
}

let promise = getInParallel([
  () => Promise.resolve("First API call!"),
  () => Promise.resolve("Second API call!")
]);
if (promise) {
  promise.then((result) => console.log(result)).catch((err) => console.log(err));
} 

Ответ №3:

Вот простой способ сделать это

 function getInParallel(apiCalls) {
  // extract function one by one from array
  // then return each function's Promise to 'rFunt' as Promise.all only accepts array, iterable of promises as an input
  let resFunt = apiCalls.map((funct) => {
    return funct()
  })
  return Promise.all(resFunt).then((res) => {
    return res
  })
}

let promise = getInParallel([() => Promise.resolve("First API call!"),
() => Promise.resolve("Second API call!")]);
if (promise) {
  promise.then((result) => console.log(result)).catch((err) => console.log(err));
}
module.exports.getInParallel = getInParallel; 

Ответ №4:

Вот короткий способ.

 function getInParallel(apiCalls) {
  return Promise.all(apiCalls.map(f=>f()));
}

let promise = getInParallel([() => Promise.resolve("First API call!"),
                             () => Promise.resolve("Second API call!")]);
if(promise) {
  promise.then((result) => console.log(result)).catch((err) => console.log(err));
}
module.exports.getInParallel = getInParallel;