#javascript #node.js #asynchronous #promise
#javascript #node.js #асинхронный #обещание
Вопрос:
Вопрос можно найти здесь:
Реализуйте
getInParallel
функцию, которая должна использоваться для параллельного вызова нескольких вызовов API. Функция принимает массив функций , которые возвращают aPromise
. Функция должна возвращать aPromise
, который должен преобразовываться в массив результатов из аргумента 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;