![](/img/trans.png)
[英]How do I resolve this promise after a for-loop of asynchronous code finishes?
[英]How do I handle asynchronous code within a promise?
基本上,我可以保证在一个循环中具有多个API调用,并将结果附加到数组中,然后由Promise.all
解决。 但是,代码似乎从不将数组的值返回给Promise.all
而仅返回未解决的Promise.all
。
这是复制的代码-
function func1(data) {
return new Promise(function(resolve, reject) {
var arr1 = data.split(". ");
var another_arr = arr1.map(function(sent) {
fetch('https://pokeapi.co/api/v2/pokemon/1/')
.then(function(response) {
return response.json();
})
})
resolve(Promise.all(another_arr))
})
}
function func_main() {
var some_string = "This is a sentence. This is another sentence."
this.func1(some_string).then(function(value) {
console.log(value)
})
}
func_main()
https://jsbin.com/vemasopojo/edit?js,控制台
输出: [undefined, undefined]
在继续打印之前,如何确保阵列完全解析?
Promise.all
期望一个promises数组,并且map
回调函数应该返回将被映射到新数组的值。
实际上,您正在传递未定义对象的数组,因为map函数根本不返回任何东西。
您应该返回fetch
调用以使其正常工作
var another_arr = arr1.map(function(sent) {
return fetch('https://pokeapi.co/api/v2/pokemon/1/')
.then(function(response) {
return response.json();
})
})
您在内部异步调用外部调用resolve,这意味着它被过早调用。
尝试以下方法:
function func1(data) {
return new Promise(function(resolve, reject) {
var arr1 = data.split(". ");
var another_arr = arr1.map(function(sent) {
fetch('https://pokeapi.co/api/v2/pokemon/1/')
.then(function(response) {
resolve(response.json())
})
})
})
}
感觉应该有一种更优雅的方法来执行此操作,但是无论如何它应该可以为您提供所需的数据。
您的问题是map函数内部缺少return语句。 没有return语句,它将返回undefined。 只需将return放在获取之前:
return fetch('https://pokeapi.co/api/v2/pokemon/1/')
.then(...
您还应该避免使用Promise构造函数。 您在那里不需要它,可以直接返回Promise.all创建的Promise:
function func1(data) {
var arr1 = data.split(". ");
var another_arr = arr1.map(function(sent) {
return fetch('https://pokeapi.co/api/v2/pokemon/1/')
.then(function(response) {
return response.json();
});
});
return Promise.all(another_arr);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.