小编Fra*_*tti的帖子

如何调用异步JavaScript函数并阻止原始调用者

我有一个有趣的情况,我通常聪明的头脑无法提出解决方案:)这是情况......

我有一个有get()方法的类...这个方法被调用来获取存储的用户首选项......它所做的是调用某个底层提供程序来实际获取数据...现在写入,它正在调用会话cookie的提供者...所以,get()调用providerGet()让我们说,providerGet()返回一个值,get()将它传递给调用者.调用者希望在它继续工作之前做出响应.

这是棘手的部分...我现在正在尝试实现一个异步的提供程序(在这种情况下使用本地存储)...所以,providerGet()将立即返回,已经调度到本地存储将调用,一段时间之后,调用一个传递给它的回调函数...但是,由于providerGet()已经返回,所以get()现在通过扩展到原来的被调用,它显然没有返回实际检索的数据.

那么,问题是,是否有一种方法可以基本上"阻止"从providerGet()返回,直到异步调用返回?请注意,出于我的目的,我并不关心这可能带来的性能影响,我只想弄清楚如何使其工作.

我不认为有办法,当然我知道我无法想出来...所以我想把它扔掉,看看其他人能想出来:)

编辑:我现在只是在学习问题的核心,即web sql API是非同步的这一事实,可能有一个解决方案...原来还有一个API的同步版本,我没有意识到...我现在正在阅读文档以了解如何使用它,但这可以很好地解决问题,因为providerGet()完全异步编写的唯一原因是允许该提供程序...获取的代码( )是我自己的抽象层的一部分,在各种存储提供商(cookies,web sql,localStorage等)之上,所以最低的共同点必须赢,这意味着如果一个是同步的,他们都必须是非同步的......唯一的一个是web sql ...所以如果有一种方法可以同步地做到这一点我的观点变得没有实际意义(尽管我认为仍然是一个有趣的问题)

edit2:好吧,似乎没有任何帮助......似乎API的同步版本没有在任何浏览器中实现,即使它是指定它只能从工作线程使用,所以这不无论如何它似乎都有所帮助.虽然,读一些其他的东西,听起来有一种方法来使用递归来拉动这个技巧...我现在正在抛出一些测试代码,如果/当我让它工作时我会发布它,看起来像一个非常有趣的一般地解决任何这种情况的方法.

编辑3:根据我下面的评论,我真的没办法完全按照自己的意愿行事.我要解决我当前问题的解决方案是不允许使用Web SQL进行数据存储.它不是理想的解决方案,但是由于该规范不断变化而且没有广泛实施,它不是世界末日......希望当它得到适当的支持时,同步版本将可用,我可以插入新的提供商,很高兴去.一般来说,似乎没有任何方式可以拉动这个奇迹...确认我的预期是这样的,但希望我错了这一次:)

javascript blocking

17
推荐指数
2
解决办法
1万
查看次数

传递给表中函数的Lua参数为nil

我正在试图了解如何在Lua中完成OOP,我认为我有一个简单的方法来做它但它不起作用我只是没有看到原因.这是我正在尝试的:

Person = { };
function Person:newPerson(inName)
  print(inName);
  p = { };
  p.myName = inName;
  function p:sayHello()
    print ("Hello, my name is " .. self.myName);
  end
  return p;
end

Frank = Person.newPerson("Frank");
Frank:sayHello();
Run Code Online (Sandbox Code Playgroud)

仅供参考,我正在使用Corona SDK,虽然我认为这没有什么区别(除了我认为print()来自哪里).在任何情况下,杀死我的部分是print(inName)报告的inName是nil ...因此,myName显然设置为nil所以调用sayHello()失败(尽管如果我硬编码一个值,它们工作正常myName,这让我觉得我正在尝试的基本结构是合理的,但我必须缺少一些简单的东西).据我所知,它看起来像调用newPerson()时没有设置inName的值,但是我不能为我的生活找出原因; 我不明白为什么它不像任何其他函数调用.

任何帮助,将不胜感激.谢谢!

lua

6
推荐指数
2
解决办法
2393
查看次数

将数据加载到Reactive Native FlatList中

我完全承认我现在对Reactive Native很新,所以我预计这是一个简单的答案和一个潜在的愚蠢问题:)事实上,这可能不是RN问题本身,我将在下面解释.

我所拥有的是以下代码:

class MyScreen extends React.Component {

  constructor(inProps) {
    super(inProps);
    this.state = { listData : [ ] };
  }

  render() { return (
    <View>
      <FlatList data={ this.state.listData }
        renderItem={ ({item}) =>
          <Text>{item.firstName} {item.lastName}</Text>
        }
      />
    </View>
  );  }

  async componentDidMount() {
    const data = [ ];
    let keys = await AsyncStorage.getAllKeys();
    keys.forEach(async function(inKey) {
      let obj = await AsyncStorage.getItem(inKey);
      obj = JSON.parse(obj);
      data.push(obj);
    });
    this.setState({ listData : data });
  };

}
Run Code Online (Sandbox Code Playgroud)

目标只是从AsyncStorage加载数据并将其转储到列表中.看起来相当基本,对吧?不幸的是,我无法让它工作:列表是空的.

现在,为了掩盖愚蠢的事情:是的,确实存储了数据,是的,它是正确的形式(我知道这是因为如果我只是抓住一个SPECIFIC项目并将其推送到数据中,那么它会按预期显示在列表中).

实际上,我知道问题是什么:它是在keys.forEach()调用完成之前执行的setState()调用.我知道这个,因为如果我用这个替换setState()调用:

setTimeout(function() {
  this.setState({ listData : …
Run Code Online (Sandbox Code Playgroud)

javascript async-await reactjs react-native react-native-flatlist

6
推荐指数
1
解决办法
1407
查看次数