我想返回状态并将其值存储在变量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);
}
答案 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();
那这里发生了什么?
mainFunction
并调用someTimeoutAction
。someTimeoutAction
返回一个诺言。旧的语法看起来有些不同。 This medium article文档应该是一个很好的起点。mainFunction
等待Promise解决。一秒钟后,它就会解决,并将值写入status
。以上代码仅适用于现代浏览器。没有翻译器,例如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()
是什么。您在这里的路径错误,应该更新您的问题,以便我们为您量身定制一个真正的解决方案。