【问题标题】:Promises in AsyncStorage from React Native来自 React Native 的 AsyncStorage 中的 Promise
【发布时间】:2016-05-16 19:38:09
【问题描述】:

从 React Native 为 AsyncStorage 编写一个小包装器,我对 getAllKeys 函数有一点问题。

如果我想检索所有值,这个片段有什么问题?

getAll: function(){
    var items = ["hh"];
    AsyncStorage.getAllKeys()
        .then( ks => {
            ks.forEach( k => {
            AsyncStorage.getItem(k)
                .then( v => items.push(v)); //console.log(k, v));
        });
        });
        return items;
  },

非常感谢

【问题讨论】:

  • 附带说明,对每个项目使用AsyncStorage.multiGet 比使用getItem 更好

标签: android ios promise react-native


【解决方案1】:

你需要:

  • 形成一个由AsyncStorage getItem(k)返回的promise组成的数组,
  • 使用Parse.Promise.when()(或Promise.all())聚合promise数组,
  • getAll()返回一个承诺。
getAll: function() {
    var items = ["hh"];
    return AsyncStorage.getAllKeys().then(ks => {
        return Parse.Promise.when(ks.map(k => AsyncStorage.getItem(k))).then(results => items.concat(results));
    });
},

如果“hh”只是用于调试目的,则简化为:

getAll: function() {
    return AsyncStorage.getAllKeys().then(ks => {
        return Parse.Promise.when(ks.map(k => AsyncStorage.getItem(k)));
    });
},

无论哪种情况,调用如下:

foo.getAll().then(function(results) {
    // here, `results` is an array of values promised by multiple calls to `AsyncStorage.getItem(k)`
    console.log(results);
}, function(error) {
    // here, handle whatever error condition that might have arisen
    console.log(error);
});

【讨论】:

  • 感谢 Roamer 和 @Jaromanda。我仍然理解这是如何工作的。但我不想检索一组承诺,我只想返回每个承诺的一组值。我怎么能做到这一点。提前致谢
  • 需要更多解释。 ks.map(...) 返回一个 Promise 数组,该数组立即传递给 Promise 聚合器 Parase.Promise.when(),后者又返回一个 Promise。因此,.getAll() 返回的 Promise 如果成功,将提供一组结果。这些结果完全 100% 不可避免地由 Promise 交付。涉及任何类型异步的函数只是无法直接返回结果。
  • 我在答案中添加了一些额外的代码,向您展示如何调用.getAll() 并访问结果。
【解决方案2】:

您正在同步返回 items,但是 .getAllKeys.getItems 返回 Promises,因此很可能是异步的

使用Promise.all等待让所有AsyncStorage.getItem完成,你的代码可以写成如下

getAll: () => 
    Promise.all(AsyncStorage.getAllKeys()
        .then(ks => 
            ks.map(k => 
                AsyncStorage.getItem(k)
            )
        )
    )
,

用法:

.getAll()
.then(items => 
    // do something with items 
)
.catch(err => 
    // handle errors
);

解释注释中的错误——如果在箭头函数中使用{},则必须使用return返回值

getAll: () => Promise.all(AsyncStorage.getAllKeys().then(ks => {
    console.log(ks);
    // return here
    return ks.map(k => { 
        console.log(k);
        // return here
        return AsyncStorage.getItem(k);
    })
})),

【讨论】:

  • getAll: () => Promise.all(AsyncStorage.getAllKeys() .then(ks => { console.log(ks); ks .map(k => { console.log(k); AsyncStorage.getItem(k) } ) } ) ),跟踪:[“7”,“3”,“4”,“5”,“1”,“ a"、"6"、"2"] 和 7,3...是键,但是,只需接收一个空数组 Storage.getAll() .then(items => // 对项目做一些事情 console.log(items) ) .catch(err => // 处理错误 console.log(err) );
  • 对上述消息感到抱歉。只是说,我收到了一个空数组,但是 AsyncStorage 中保存了一些对象。谢谢
  • 因为你在箭头函数中使用了{},所以你需要return ks.map ...return AsyncStorage.getItem(k) ...我会编辑答案给你看
猜你喜欢
  • 2021-02-05
  • 1970-01-01
  • 1970-01-01
  • 2019-01-26
  • 1970-01-01
  • 1970-01-01
  • 2017-02-01
  • 1970-01-01
  • 2019-11-03
相关资源
最近更新 更多