【问题标题】:Javascript - Next line executes before call back completesJavascript - 在回调完成之前执行下一行
【发布时间】:2015-10-12 02:09:22
【问题描述】:

我有一个 html 文件,其中包含 2 个 js。 first.js 有一个 getJSON 调用和一个回调函数,如下所示:

    finalResult = ""
callbackfunction = function(result){
    finalResult = some manipulation with result
}
getJSON (url, callbackfunction)

second.js 使用的是 first.js 的数据 'finalResult'。如下所示:

ultimateResult = some manipulation with finalResult

问题:ultimateResult 行在调用回调函数之前被执行,因此 second.js 总是将 finalResult 读取为空值。

在进行 json 调用之前,我尝试将 ajax 异步变量设置为 false --> Dint help 我尝试将 first.js 的脚本包含在 second.js 中以在最终脚本行之前执行它 --> Dint help 我不能在 first.js 的回调中包含 second.js UltimateResult 脚本 --> 这不是我的选择

我可以在ultimateResult 可以等待回调完成的性能上妥协,但我不确定如何实现它。如果我尝试使用带有 while 条件的标志(当然),程序会循环。

谢谢!

【问题讨论】:

  • 从回调内部调用ultimateResult?
  • 感谢您的回复。不幸的是,这不是我的选择,我在描述中提到了这一点:)

标签: callback


【解决方案1】:

所以你有:

HTML:

<script src="first.js"></script>
<script src="second.js"></script>

first.js:

var finalResult = '';
var callBackFunction = function(result) {
  finalResult = codeManipulation();
}
getJson(url, callBackFunction);

second.js:

function ultimateResult(result) {
  console.log(result);
}
ultimateResult(finalResult);

//OUTPUTS EMPTY STRING
  • 您可以使用承诺而不是回调。这是推荐的方法
  • 您可以在返回 UltimateResult 正在监视的值时触发事件
  • 您最初可以将 finalResult 的值设置为 undefined,然后在递归循环中检查该值,直到它被定义为止。
  • 非常糟糕的主意,不要这样做:在调用 UltimateResult 时设置一个超时。这很糟糕,因为如果调用在 API 之前返回,您就是在浪费时间。当调用花费的时间比预期的要长时,情况会更糟,因为如果在调用时该值尚未返回,则该值将以空字符串的形式返回。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-31
    • 1970-01-01
    • 1970-01-01
    • 2017-06-07
    • 2017-05-24
    • 2021-01-03
    • 2021-07-30
    相关资源
    最近更新 更多