javascript - 如何等待获取json文件的数据然后继续

标签 javascript api

我是 JavaScript 新手,但有一个问题:

我执行fetch('path'),然后分配值并返回它。后来我在其他函数中调用这个函数,但它首先以空值运行,而不等待分配值。我该如何解决这个问题?我认为我应该使用 asyncawait 但不知 Prop 体如何使用。

function loadLocalJson(path) {
let users = [];

fetch(path)
    .then(response => {
        if (!response.ok) {
            throw new Error('Network response was not ok :(');
        }
        return response.json();
    })
    .then(results => {
        users = results
        console.log(users);
    }) 
    .catch(err => console.log('Error', err));

return users;
}

function getFilteredAndSortedArray(users, price) {
    console.log(users, price);
    return users.filter(user => {
        return user.salary && user.salary > price;
    })
    .sort(user => user.name);
}

users = loadLocalJson('users.json');
usersB= getFilteredAndSortedArray(users, 1000);
console.log(usersB, usersA);

// PrefixedUsersArray(users)    
// ...

最佳答案

您需要了解异步代码的工作原理。获取请求返回一个 Promise,因此您必须返回 Promise 并使用 .then() 访问该值:

function loadLocalJson(path) {
  return fetch(path)
    .then(response => {
      if (!response.ok) {
        throw new Error('Network response was not ok :(');
      }
      return response.json();
    })
    .catch(err => console.log('Error', err))
}

function getFilteredAndSortedArray(users, price) {
  console.log(users, price);
  return users.filter(user => {
    return user.salary && user.salary > price;
  }).sort(user => user.name);
}

loadLocalJson('users.json').then(users => {
  usersB = getFilteredAndSortedArray(users, 1000);
  console.log(usersB, users);
})

您不必分配用户,您只需返回 promise 即可,因为您已经调用了 response.json()。另外,您的排序功能很可能不起作用,请尝试如下操作:

users.sort((a, b) => a.name.localeCompare(b.name))

关于javascript - 如何等待获取json文件的数据然后继续,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58656925/

相关文章:

javascript - 如何在循环内的闭包中保留参数?

javascript - 当我想用nodejs进行mysql插入时,为什么会出现解析错误

php - 在 PHP 中选择框数组

javascript - ngview 添加部分内容并保留现有内容

javascript - Adobe Air Javascript API

spring - 使用 RESTful 登录 API 验证我的 Spring Boot 应用程序

javascript - 动态更改嵌套 JSON

api - PayPal REST API 的 "accept and store credit cards"部分是否需要 Advanced 或 Pro 产品?

javascript - 使用 JScript 从 tfs 扩展调用 Rest API

android - 使用 Retrofit 以这种格式发布字段