javascript - 基本的 JavaScript 线程
问题描述
所以我正在研究一个需要一个名为 PagePic 的变量的函数,该变量在另一个名为 getPage() 的函数中初始化,如下所示:
function somefunc(){
getPage();
addMarker({ coords:{lat:Lat,lng:Long},iconImage:PagePic)}
}
代码中的某处:
function getPage(){
FB.api('/*******?fields=picture,events', function(response) {
PagePic = response["picture"].data.url
}
但是,getPage 不会及时完成,因此在没有 iconImage 的实际值的情况下调用 addMarker。从我完成的测试来看,似乎 getPage 仅在 addMarker 完成时才开始工作,但我可能错了。我尝试了自定义 sleep() 函数,但没有帮助。从谷歌我看到浏览器只有一个线程,并且我计划将来将我正在从事的项目转移到移动设备上。那么,当我在移动版本上工作时,有没有可以实施的解决方案,或者我可以在这里修复它吗?谢谢!
解决方案
Javascript 不是多线程的。您正在处理的内容称为异步,而不是多线程。有很多方法可以解决这个问题:回调、承诺、异步。
对于一个基本的想法,做这样的事情(使用回调):
function cb(pagePic) {
addMarker({ coords:{lat:Lat,lng:Long},iconImage:PagePic)};
}
function someFunc() {
getPage(cb);
}
function getPage(callback){
FB.api('/*******?fields=picture,events', function(response) {
PagePic = response["picture"].data.url;
callback(PagePic);
}
编辑:并不是 getPage() 没有及时完成。它正在完成。但是回调在事件循环中进行,并且只有在所有同步代码完成后才会执行。这是一个例子:
console.log("a");
setTimeout(console.log.bind(this, "b"), 0);
console.log("c");
0 毫秒超时。这应该打印“a”“b”“c”,对吧?不完全的。
推荐阅读
- reactjs - Gutenberg 自定义块:按 innerBlocks 长度添加元素
- python - Python 难以理解带有列表的 for 循环
- html - 导航下拉菜单 CSS
- php - $_SESSION['firstname'] 每次返回空白
- vue.js - 如何在多个 vue 组件中重用相同的功能
- javascript - Selenium Chrome 驱动程序:点击功能的 Javascript。元素不可见或没有任何反应
- python - 使用作为 Cron 作业运行的 Python 脚本的问题 Ping
- laravel - Laravel 未定义的请求变量
- jquery - JSP Ajax表单提交到servlet put方法不起作用
- python - 熊猫时间序列箱线图