JavaScript, React - отправка нескольких одновременных вызовов ajax, борющихся с обещаниями. В основном я хочу, чтобы цепочка вызовов, если один вызов сервера завершен, а затем выполняет только следующий вызов и собирает успешную реакцию вызовов с конечной точки /pqr, сделанной внутри makeServerCalls.
import Promise from 'bluebird';
import request from 'superagent';
// sends a post request to server
const servercall2 = (args, response) => {
const promise = new Promise((resolve, reject) => {
const req = request
.post('${baseUrl}/def')
.send(args, response)
.setAuthHeaders();
req.endAsync()
.then((res) => resolve(res))
.catch((err) => reject(err));
});
return promise;
};
// sends a post request to server
const servercall1 = (args) => {
const promise = new Promise((resolve, reject) => {
const req = request
.post('${baseUrl}/abc')
.send(args)
.setAuthHeaders();
req.endAsync()
.then((res) => resolve({res}))
.catch((err) => reject(err));
});
return promise;
};
// function to send request to cgi server to execute actions from ui
async function makeServerCalls(args, length) {
// convert args to two dimensional array, chunks of given length [[1,2,3], [4,5,6,], [7,8]]
const batchedArgs = args.reduce((rows, key, index) => (index % length === 0 ? rows.push([key])
: rows[rows.length - 1].push(key)) && rows, []);
const responses = [];
for (const batchArgs of batchedArgs) {
responses.push(
// wait for a chunk to complete, before firing the next chunk of calls
await Promise.all(
***// Error, expected to return a value in arrow function???***
batchArgs.map((args) => {
const req = request
.get('${baseUrl}/pqr')
.query(args)
// I want to collect response from above req at the end of all calls.
req.endAsync()
.then((response) =>servercall2(args,response))
.then((res) => res);
})
)
);
}
// wait for all calls to finish
return Promise.all(responses);
}
export function execute(args) {
return (dispatch) => {
servercall1(args)
.then(makeServerCalls(args, 3))
.then((responses) => {
const serverresponses = [].concat(...responses);
console.log(serverresponses);
});
};
}
Ошибка: ожидается возврат значения в функцию стрелки. Что я здесь делаю неправильно?
Является ли это правильной цепью или ее можно оптимизировать?
Что произойдет, если какой-либо вызов не пройдет между ними?
Для этого вы можете использовать библиотеку Async. Не нужно заново изобретать колесо.
Существует функция водопада, которая принимает список функций, которые выполняются последовательно. Вы можете передать результат функции 1 функции 2 в функцию 3 и т.д. После завершения полного водопада вы получите результат в обратном вызове. Вы можете больше узнать об этом в документах.