Javascript For循环中的承诺

Javascript For循环中的承诺,javascript,promise,Javascript,Promise,我有以下代码: _getSupport() .then((data) => { _getSupport(data[0]) .then(() => _getSupport(data[1]) }) .catch(e => { console.log(e); }); \u获取支持返回一个承诺。 我的目标是对第一次返回的值再次调用\u getSupport。 所以我想: _getSupport() .

我有以下代码:

 _getSupport()
.then((data) => {                   
    _getSupport(data[0])
        .then(() => _getSupport(data[1])    
})
.catch(e => {
      console.log(e);
});
\u获取支持
返回一个
承诺
。 我的目标是对第一次返回的值再次调用
\u getSupport
。 所以我想:

_getSupport()
.then((data) => {       
    let a = [];
    data.forEach(element => {
        a[element] = _getSupport(element)   
      });
      Promise.all(a).then().catch(e => {
      });
 })
 .catch( e => {console.log(e)})
但这不起作用,代码总是转到最后一个捕获

更新

getSupport()
的格式如下

function _getSupport(param = {}) {       

    return new Promise((resolve, reject) => {           
        remoteClient.sendRequest(request, function (data) {             
            resolve(data);
        });
    });
}    

如果您的
\u getSupport
有效并且没有抛出错误,那么您也可以将代码修改为如下内容:

_getSupport()
  .then(data => {
    let a = [];
    data.forEach(element => a[element] = _getSupport(element))
    return Promise.all(a).then().catch(e => {})
  })
  .catch(e => console.log(e))
在这里,您还可以返回最后一个承诺。所有的问题都在这里

let a = [];
data.forEach(element => {
  a[element] = _getSupport(element)   
});
因为数据中几乎可以包含任何内容;数字、对象、字符串等等,所以当您设置[element]时,实际上是在为数组设置特定的属性

a = []
a['see_this?'] = 'does this even make sense?'
你明白了

你应该做的是

let a = [];
data.forEach(element => {
  a.push(_getSupport(element))
});
// or
a = data.map(element =>_getSupport(element));

然后使用你的
承诺;当然,如果这是一段函数代码,您需要返回它,以便其他人可以
。然后()
,因此
返回承诺。all()

有时嵌套的承诺会产生问题

我们需要将承诺累积到一个数组中,以便您可以将它们全部返回。 这就是为什么a.push()会将承诺推送到数组中

a = []
a['see_this?'] = 'does this even make sense?'
next.then()函数中的数据是每个承诺的响应数组,它们的推送顺序相同

添加console.log(数据)以查看进一步迭代的值。如果无法迭代数据,则可能会抛出错误

请尝试单独执行“_getSupport()”函数,看看是否有错误,如果没有,请尝试我的代码,这样就可以了

    _getSupport()
     .then((data) => {       
         let a = [];
         data.forEach(element => {
         a.push(_getSupport(element))
         });
         return Promise.all(a)
      })
     .then((data) => {
      // If it returns an array of elements then this data will be
      // [[0,1,2],[1,2,3] ...] based on the number of elements returned in 
      // first call
      })
     .catch( e => {console.log(e)})

这个答案与其他答案几乎相同,只需2美分:您可以使用
.map
而不是
forEach
push

let getPromiseObj = data => new Promise((resolve, reject) =>
  setTimeout(
    () => resolve(data || ['No', 'truthy', 'data']),
    1000
  )
)

getPromiseObj()
  .then(res => Promise.all(res.map(getPromiseObj)))
  .then(finalRes => console.log(finalRes))
  .catch(e => console.error(e))

虽然所有的答案都刺激了我的大脑,但两个答案都没有达到预期效果。 我找到的唯一解决方案来自以下方面:


上次捕获中记录了什么控制台?例如,可能是
\u getSupport()
从一开始就返回错误,或者数据不是数组。我省略了代码,但数据始终是数组。错误e是empy。如果
元素
是一个数字,并且
\u getSupport()
返回一个像这样的数字数组
[0,1,2,3]
,那么使用
a[0]
a[1]
等应该就可以了。不可以?@Akrion yes这样就可以了。但是数组必须包含
数字
而不是
字符串
。@Akrion可能是您的
\u getSupport
首先抛出了一个错误,因此您将进入最后一个捕获。如果您使用
\u getSupport
函数以及
数据的性质编辑您的问题,那就太好了