В моей функции javascript я могу вызвать службу отдыха внутри обещания.
function update(item) {
return new Promise(function (resolve, reject) {
client.get(urls[env] + item['itemId'], function (data, response) {
try {......
Теперь, когда я изменяю ту же функцию для обработки массива элементов, как:
function update(itemList) {
return new Promise(function (resolve, reject) {
itemList.forEach((item) =>{
client.get(urls[env] + item['itemId'], function (data, response) {
try {
Это не работает. Призыв к отдыху просто не происходит. Это тоже не подводит.
Что мне здесь не хватает?
Я печатаю его размер и могу видеть значения внутри него во время отладки ... так что, конечно, у него есть элементы.
Тогда, возможно, вам стоит поделиться полным кодом и выводом.
Не помещайте цикл forEach внутрь исполнителя new Promise. Поместите туда только асинхронный вызов.
Значит, вы имеете в виду, что асинхронный вызов внутри Promise вообще не работает? Любая причина, по которой это происходит. Я относительно новичок в JS, отсюда и эти проблемы.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы можете попробовать написать функцию, которая возвращала бы обещание для client.get вместо обратного вызова.
Следующий код показывает, как это сделать, я использую ES5, но предполагаю собственные промисы или полифил:
function promiseClientGet(o, url){
return new Promise(function(resolve,reject){
o.get(url, function (data, response) {
// try {...... need to call resolve or reject
});
});
}
function update(itemList) {
return Promise.all(itemList.map(function(item) {
return promiseClientGet(urls[env] + item['itemId'], client);
}))
}
Использование ES6:
const promiseClientGet = (o, url) => new Promise((resolve,reject)=> {
o.get.apply(o, (data, response) => {
// try {...... need to call resolve or reject
});
});
const update = itemList =>
Promise.all(itemList.map(item => promiseClientGet(urls[env] + item['itemId'], client)));
Если вы просто хотите делать параллельные запросы и ждать, пока все они закончатся и вернут результаты, вы можете использовать Promise.all()
const getAll = (items) =>
Promise.all(items.map(i => callApi(i)))
getAll([1, 2, 3])
.then(results => console.info(results))
Вы на 100% уверены, что массив не пуст?