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
函数以及数据的性质编辑您的问题,那就太好了