React Native AsyncStorage 返回承诺而不是值

2023-12-25

我知道这是 RN 中一个非常常见的问题,我仍在尝试了解从属性文件加载数据时返回 Promise 的可能优势,而不是仅仅返回值,这使得链接请求非常麻烦......但无论如何。这是我现在拥有的,它是 AsyncStorage RN 实现的包装器:

multiGet = async (key) => {
    var value = null;
    try {
      value = await AsyncStorage.multiGet(key).then(
        (values) => {
          value = values;
          console.log('Then: ',values);
        });
    } catch (error) {
      console.log('Error: ',error);
    }
    console.log('Final: ',value);
    return value;
    }

此时,值变得不确定。在我的主要代码中我有这个:

var filter = this._getFilter();
console.log('returned filter:',filter);

_getFilter 函数是使用 AsyncStorage 包装器的函数,但“返回的过滤器”在第一个函数之前进行记录,因此它不会在继续之前等待返回值,因此我得到一个未定义的值。

起初,我认为只要使用 async/await,AsyncStorage 就会返回一个值而不是承诺,但经过测试,我得到的值是:

value = await AsyncStorage.getItem('key') 

仍然是一个承诺,所以我必须使用 then() 来读取该值。

基本上我在日志中看到的顺序是:

_getFilter
returned value: undefined
Then: value: here I get the correct value from the keys but the code already passed and I don't have the correct value in the variable

我不知道发生了什么或如何正确处理这个问题。这应该是非常简单且常见的用例。

我很想在不使用第三方模块的情况下解决这个问题。

Thanks

SOLUTION编辑:在更多地了解异步/等待和回调的概念之后,我终于有了一个可以工作的代码。我不喜欢它,因为它使代码很难阅读。我可能需要重构它以使用承诺,但现在它可以工作。以下是一些片段,以防有人发现同样的问题:

this._getFilter(body,this._filterSearchCallback,callback);

注意:我通过链发送正文,因为我在传递函数时“完成”信息。第二个参数是实际进行 fetch 查询的第一个回调,第三个回调是 fetch 函数的返回。

_getFilter(body,callback,returnCallback){

      {...}

      this._sh.multiGet(keysBanks).then(
        (banks) => {
          filter.banks = banks;
          console.log(banks);
          this._sh.multiGet(keysCards).then(
            (cards) => {
              console.log(cards);
              filter.credit_cards = cards;
              callback(body,filter,returnCallback);
            });
        }
      );

    }

基本上,我在这里链接了几个获取,因为我需要来自商店的多个值。这是我不太喜欢的部分。 _sh 是我的 StorageHelper,它是 AsyncStorage 的包装器,没什么花哨的。

multiGet = async (key) => {
    const value = await AsyncStorage.multiGet(key);
    return value;
    }

然后我的最后一个回调实际上在 React Native 中进行获取并将 JSON 响应发送到主屏幕:

_filterSearchCallback(body,filter,callback){

      body.filter = filter;

      return fetch(apiUrl, {method: 'post', body: JSON.stringify(body)})
      .then((response) => response.json())
      .then((responseJson) => {
        callback(responseJson);
      })
      .catch((error) => {
        console.error(error);
        callback(responseJson);
      });
    }

我会改进它并使其更干净,但现在它有效。希望它也能帮助其他人。


曾经,我也遇到过同样的问题,所以我将在这里与您分享我的做法。

基本上,你的执行是在不获取任何值的情况下向前推进的,即不确定你现在得到的是什么,所以有 3-4 种方法可以摆脱这种情况:

1) 异步等待 2)回调

1)我们将从大多数人使用的回调开始。

我们将使用您的代码来实现这一点:

    _getFilter(key,callback)
{
    multiGet = (key) => {
        var collect;
        try {
          var value = AsyncStorage.multiGet(key).then(
            (values) => {
           //   value = values;
              console.log('Then: ',values);
             callback(values)
            });
        } catch (error) {
          console.log('Error: ',error);
        }
        console.log('Final: ',value);

        }
}

    this._getFilter(key,function(filter){
      console.log('returned filter:',filter);
    });

2)异步/等待

如果您单独使用await,那么您会收到错误,要在函数内使用await,您必须通过在函数名称之前设置async关键字来声明异步函数。

 async _getFilter(key)
{

multiGet = async (key) => {
    var value,collect;
    try {
      value = await AsyncStorage.multiGet(key).then(
        (values) => {
          collect= values;
          console.log('Then: ',values);
        });
    } catch (error) {
      console.log('Error: ',error);
    }
    console.log('Final: ',value);
    return collect;
    }

//calling the async function

this._getFilter(key).then((filter)=>{
if(filter!=null)
console.log('returned filter:',filter)
else
console.log('error')
})

希望这能澄清您的概念,并帮助您与其他 React Native 开发人员合作。我看到很多人在这件事上苦苦挣扎,所以今天我有机会消除您的疑虑。

干杯:)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

React Native AsyncStorage 返回承诺而不是值 的相关文章

随机推荐

  • 无法解析远程名称:“api.nuget.org”

    我在 Visual Studio 2017 中使用包管理器控制台安装 Nuget 包时遇到问题 以下是错误的完整详细信息 install package Unable to load the service index for source
  • bat 函数编辑文件(在文件开头添加行)

    在我的bat脚本中 我该如何打开一个名为open txt的文件并将以下行添加到顶部 SOME TEXT TO BE ADDED 像这样的小编辑可以在 bat 脚本中处理吗 当然 有类似的东西 copy original txt temp t
  • 将分支上的提交子集作为 github Pull 请求呈现

    我在 github 上 fork 了一个项目 我在我的 master 分支上提交了 1 2 3 4 和 5 我想将提交 2 和 5 作为拉取请求呈现给上游 这样当上游接受并且我将我的分支与上游同步时 我就不会遇到任何冲突 我可以通过哪些方式
  • 从触摸位置快速获取SCNNode环境中的向量

    我有相机的位置和方向 屏幕上的 CGPoint 触摸位置 我需要在 3d SCNNode 环境中触摸屏幕方向的线 最好是矢量 我怎样才能得到这个 代码片段会非常有帮助 您可以使用SCNSceneRenderer unprojectPoint
  • .NET Core 2 中使用 Castle DynamicProxy 进行 Autofac 方法级拦截

    我目前编写了一个拦截器 代码如下 public class TransactionalInterceptor IInterceptor public void Intercept IInvocation invocation using v
  • JTextPane 不换行?

    我正在 JTextPanel 中显示 RSS 提要 显示的结果不会换行 如何在 JTextPane 中插入 n 谢谢 写新闻类 public String writeNews String result try DocumentBuilde
  • Google Apps 脚本中的 Utilities.unzip(blob) 的 blob 大小是否有限制?

    我有一个谷歌脚本 它访问一个网站 找到一个 zip 文件 解压缩它 并从相关文件中提取相关数据 我想做同样的事情 但对于同一站点上不同的 更大的 zip 文件 我已经访问了 zip 使用几乎相同的代码 但它抛出一个错误 无法解压缩 My c
  • 使用转换器的数据触发不起作用

    我正在尝试根据文本块的值更新其颜色 看似简单却行不通 这是文本块 xaml
  • 如何将函数调用添加到列表中?

    我有一个使用以下函数的 Python 代码 def func1 arguments a b c def func2 arguments d e f def func3 arguments g h i 上述每个功能都会在产品上配置 CLI 命
  • 将行转换为列 Shell 脚本

    我有以下格式的数据 APP OWNER hari APP AREA Work Business Area AUS APP ID 124080 我希望将数据转换为以下格式 APP OWNER APP AREA APP ID hari Work
  • Firebase DatabaseException:无法将 java.lang.Long 类型的值转换为 String

    com google firebase database DatabaseException 转换失败 java lang Long 类型的值转换为 String 是我在按照文档尝试将数据检索到对象以供使用时不断收到的错误 这是我的对象模型
  • 没有匹配的函数用于调用构造函数(c ++)[重复]

    这个问题在这里已经有答案了 EDIT 好吧 我又花了几个小时阅读了一些内容 我想我终于更好地理解了 C OOP 至少是基础知识 我决定一次重写整个程序和代码并进行更多测试 我想这次我缩小了错误的范围 命名风暴 h include
  • Plotly:躲避散点图分类轴上的重叠点

    我正在尝试使用绘图来比较回归模型的系数 并使用置信区间的误差线 我使用以下代码来绘制它 使用变量作为分类y散点图中的轴 问题是这些点是重叠的 我想避开它们 就像您设置时在条形图中发生的那样barmode group 如果我有一个数字轴 我可
  • Rails - 有 2 个字段的查找依据?

    我在控制器中有以下内容 def update permission Permission find by user id params user id 但我希望它也能通过另一个参数找到 project id 我怎样才能在 Rails 中做这
  • 如何让我的维吉尼亚密码忽略原始消息中的空格

    我试图制作一个维吉尼亚密码 但我似乎找不到一种方法来实现在输入消息时忽略输入的空格 然后打印最后的功能 例如 我输入起始消息 python 计算 然后我输入密钥为 stack 如果程序忽略原始消息中的空格 我希望得到 isukzg wppa
  • 对象文字属性值简写与“this”不兼容

    在 JavaScript 中可以执行以下操作 var a this this 但使用 ES6 属性简写时 我得到 SyntaxError var b this SyntaxError this is a reserved identifie
  • 关于 MvcContrib TestHelpers 的新手问题

    我刚刚开始使用 MvcContrib 中的 TestHelpers 我想尝试在我的控制器上测试一个操作方法 该方法本身测试 IsAjaxRequest 是否为 true 我使用了 TestHelper 示例中显示的相同代码来设置 TestC
  • snprintf:是否有任何 C 标准提案/计划来更改此函数的描述?

    C语言标准是否有任何提案 或计划 来更改 最后一句 描述snprintf函数使得描述的歧义这是我的答案 https stackoverflow com questions 7706936 is snprintf always null te
  • Google Play 游戏服务错误代码 400

    有一个使用玩游戏服务的应用程序 但由于某种原因它停止工作 看起来有时我可以成功登录 但通常 不能 如果我检查 API 流量 大约有 10 的人得到响应代码 200 其他人得到响应代码 404 得到404的方法 游戏 应用程序 玩过 游戏 事
  • React Native AsyncStorage 返回承诺而不是值

    我知道这是 RN 中一个非常常见的问题 我仍在尝试了解从属性文件加载数据时返回 Promise 的可能优势 而不是仅仅返回值 这使得链接请求非常麻烦 但无论如何 这是我现在拥有的 它是 AsyncStorage RN 实现的包装器 mult