Javascript 如何在承诺内处理异步代码?
基本上,我有一个承诺,在一个循环中有多个API调用,该循环将结果附加到一个数组中,然后由Javascript 如何在承诺内处理异步代码?,javascript,es6-promise,Javascript,Es6 Promise,基本上,我有一个承诺,在一个循环中有多个API调用,该循环将结果附加到一个数组中,然后由promise.all解决。但是,代码似乎从不将数组的值返回到Promise.all,而只是返回未解析的Promise 这是复制的代码- function func1(data) { return new Promise(function(resolve, reject) { var arr1 = data.split(". "); var another_arr = arr1.map(functi
promise.all
解决。但是,代码似乎从不将数组的值返回到Promise.all,而只是返回未解析的Promise
这是复制的代码-
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()
输出:[未定义,未定义]
如何确保数组在继续打印之前已完全解析?
Promise。所有
都需要一个Promise数组,而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();
})
})
承诺。所有
都需要一个承诺数组,而映射
回调函数应返回将映射到新数组的值
实际上,您正在传递一个未定义对象的数组,因为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())
})
})
})
}
感觉应该有一种更优雅的方法来实现这一点,但无论如何,这应该可以为您获取所需的数据。您在内部异步调用之外调用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语句,它将返回未定义的。只需将return放在fetch前面:
return fetch('https://pokeapi.co/api/v2/pokemon/1/')
.then(...
您还应该避免使用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);
}
您的问题是map函数中缺少return语句。如果没有return语句,它将返回未定义的。只需将return放在fetch前面:
return fetch('https://pokeapi.co/api/v2/pokemon/1/')
.then(...
您还应该避免使用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);
}
避开这个!避开这个!