首页 > 解决方案 > 基本的 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() 函数,但没有帮助。从谷歌我看到浏览器只有一个线程,并且我计划将来将我正在从事的项目转移到移动设备上。那么,当我在移动版本上工作时,有没有可以实施的解决方案,或者我可以在这里修复它吗?谢谢!

标签: javascriptmultithreading

解决方案


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”,对吧?不完全的。


推荐阅读