在嵌套函数仍在运行时暂停外部函数

时间:2017-11-29 22:26:35

标签: javascript jquery json promise nested

由于Javascript是单线程的,我真的不知道这是一个什么问题,但它是这样的:我有一个被调用的函数,并在其中另一个函数。一旦Javascript开始执行内部函数,它同时恢复外部函数,当我真的希望它等到内部/嵌套函数完成然后继续。我希望这是可以理解的,但我会在评论中进一步阐述:

function foo() {
    "use strict";

    //get some json file
    $.getJSON("bar.json", function(data) {
        //calculate something with data
        //put the result in this div (innerHTML)
    });

    //display: block the div with results   
}

问题是,即使计算尚未完成,它也会立即显示div。然后它会抛出结果,这根本不是我想要的。我是否必须做出承诺或类似的事情?

提前感谢您的帮助。我非常感激。

3 个答案:

答案 0 :(得分:1)

由于您的$.getJSON()是异步操作,因此您需要使用Promise来获得所需的结果。在then块中,您可以使用结果显示块。或者,这可以在$.getJSON()块中完成。如果您需要后者,请按以下步骤操作:

function foo() {
    "use strict";

    //get some json file
    new Promise(function(resole, reject) {
      $.getJSON("bar.json", function(data) {
        //calculate something with data
        //put the result in this div (innerHTML)
        resolve(data)
      });
    }).then(function(data) {
       //display: block the div with results
    });
}

答案 1 :(得分:0)

你不应该试图阻止主线程。相反,移动改变tearDown的{​​{1}}的逻辑,该display:block内部回调是在获取JSON后运行的,如下所示:

div

答案 2 :(得分:0)

Spencer Wieczorek非常有用的链接。我将代码更改为:

std::array<int, 64>  ini_data()
{
  std::array<int, 64> ret;
  for(int i = 0; i < 64; i++)
  {
    ret[i] = i;
  }
  return ret;
}

const std::array<int, 64> DATA = ini_data();

void main()
{
  print(DATA);
}

现在似乎有用了。非常感谢教我这种获得JSON的更好方法。