【问题标题】:return a value from javascript function and then execute code inside it从 javascript 函数返回一个值,然后在其中执行代码
【发布时间】:2017-05-04 19:51:36
【问题描述】:

我有一个 javascript 函数,它需要返回 true 才能更新浏览器 UI。在执行代码进行后端调用之前,如何确保函数返回?

 self.resortCopy = function(item) {
 self.resorts.push(item);
 self.backendCall(item) // this needs to be performed after returning true
 return true;

【问题讨论】:

  • 实在没办法把函数调用放在return语句之后,你能希望的最好的就是用超时延迟执行,希望能行。
  • 这个浏览器是JS还是NodeJS?如果是浏览器,它需要支持多远?如果是 NodeJS,哪个版本?对可用的语言功能有所不同。
  • 它已经是异步的了。当您调用self.backendCall(item) 时,js 不会等待它完成并立即调用下一行return true
  • @OleksiiChekulaev 好的,谢谢。我想还有其他问题
  • @OleksiiChekulaev,这是不正确的。 backendCall 中的任何代码都将首先执行。如果该代码包含 XHR 或 worker 执行或其他异步任务,则不会等待其回调,但所有其他代码将同步运行。

标签: javascript asynchronous browser settimeout setinterval


【解决方案1】:

我想你在 self.backendCall (XHR/fetch) 中有一个 ajax 请求

如果是这样,那么你的代码已经异步了

否则,看@hemp的回答

function ajax(){
  fetch("https://httpbin.org/get").then(data=>{
    console.log("DONE")
  })
}

function test(){
  ajax();
  return true;
}

console.log(test())

【讨论】:

  • 警告,任何版本的IE都不支持fetch API。
  • @hemp Nighter 是箭头函数,但是为了这个演示,XHR 写得一团糟。
【解决方案2】:

假设浏览器JS,你可以普遍使用setTimeout,这将保证当前代码路径在backendCall代码执行之前完成,但它没有说明什么时候(除非你指定超时时间)。

self.resortCopy = function(item) {
self.resorts.push(item);
window.setTimeout(self.backendCall.bind(self, item), 0);
return true;

【讨论】:

  • 是普通的Js。不知道可以这样做,但是根据 cmets,代码已经是 asyc
  • 我不熟悉“常规 JS”作为说明符。即使是在浏览器中,目标浏览器也会有很大的不同。
  • 对不起,我的意思是,来自浏览器 (chrome) 的 javascript 执行 ajax 来调用后端服务。此处不使用任何框架。
猜你喜欢
  • 1970-01-01
  • 2012-10-16
  • 2012-09-27
  • 1970-01-01
  • 2022-12-25
  • 2012-06-03
  • 1970-01-01
  • 1970-01-01
  • 2020-04-05
相关资源
最近更新 更多