从setTimeout()返回一个值

时间:2019-04-18 13:19:59

标签: javascript angular

我想返回状态并将其值存储在变量s中。 我会感谢您的帮助。

这是我的代码:

let s = setTimeout( ()=>{
   this.matchService.getMatches().subscribe(ms => {
       this.matches = ms;
       let match = this.matches.find(match => match.id == id);
       let status = match.status;
       if(status == 'closed' || status == 'live') {
          this.status.name = status;
        }
        return status;
      });
  },9000);
}

2 个答案:

答案 0 :(得分:5)

此处的答案专门针对setTimeout问题。如果您采用可观察的方法,请考虑使用bambam的答案!

好吧,如果您不知道concept of async,此答案可能会有些奇怪。 基本上,最简单的方法是将setTimeout包装到Promise中,如下所示:

const someTimeoutAction = () => {
  // Let's return a new Promise, promising to eventually return a value
  return new Promise((resolve) => {
    setTimeout(() => {
      resolve('hello world');
    }, 1000);
  });
};

// The following function is an async function, that will
// help to work better with Promises.
const mainFunction = async () => {
  console.log('Waiting for status');
  const status = await someTimeoutAction();
  console.log(status);
};
mainFunction();

那这里发生了什么?

  1. 调用mainFunction并调用someTimeoutAction
  2. someTimeoutAction返回一个诺言。旧的语法看起来有些不同。 This medium article文档应该是一个很好的起点。
  3. mainFunction等待Promise解决。一秒钟后,它就会解决,并将值写入status
  4. 所有其他一切都像往常一样继续进行。

以上代码仅适用于现代浏览器。没有翻译器,例如IE11。 但是,旧语法可以正常工作:

function someTimeoutAction() {
  // Let's return a new Promise, promising to eventually return a value
  return new Promise((resolve) => {
    setTimeout(() => {
      resolve('hello world');
    }, 1000);
  });
};

// The following function is an async function, that will
// help to work better with Promises.
function mainFunction() {
  console.log('Waiting for status');
  someTimeoutAction()
    .then(function(status) {
      console.log(status);
    });
};
mainFunction();

答案 1 :(得分:5)

由于您已经有了一个可观察的对象,因此只需延迟它即可,而不必使用setTimeout!在这种情况下,另一个答案的承诺方法也是胡说八道。

this.matchService.getMatches()
    .pipe(delay(9000))
    .subscribe(ms => {
       this.matches = ms;
       let match = this.matches.find(match => match.id == id);
       let status = match.status;
       if(status == 'closed' || status == 'live') {
          this.status.name = status;
       }
  });

代码的更大问题是,您永远不会从订阅中返回。实际上,您宁愿延迟matchService中的(我正在猜测)http调用,但是您没有显示相关代码。

请注意,订阅可能会多次触发,具体取决于getMatches()是什么。您在这里的路径错误,应该更新您的问题,以便我们为您量身定制一个真正的解决方案。