Javascript 如何在承诺内处理异步代码?

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

基本上,我有一个承诺,在一个循环中有多个API调用,该循环将结果附加到一个数组中,然后由
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);
}
避开这个!避开这个!