veb*_*ben 9 asynchronous synchronous promise typescript angular
我想在完成f2
后打电话f1
.f1
函数可以是同步的或异步的.我需要一个适用于这两种情况的示例.我找到了一个解决方案,使用一个Promise
和一个计时器:
global() {
this.f1().then(res => {
this.f2()
})
}
f1() {
return new Promise<any>((resolve, reject) => {
// Some code...
setTimeout( () => {
resolve(x);
}, 1500);
});
}
f2() {
// Some code...
}
Run Code Online (Sandbox Code Playgroud)
问题是程序总是要等待1500ms.我不希望f2
在f1
完成之前开始.有没有办法等待所需的时间,而不是更多或更少?
因此,删除setTimeout
零件。它将调用resolve
或reject
,然后将执行传递给下一个then
或catch
处理程序。如果Promise中有一些异步调用,则需要调用resolve/reject
该调用的结果。
不等待怎么办1500ms
-给定的时间实际上是可以调用该函数的最短时间。也许之后2000ms
这与JS代码在其中工作的主线程有关。如果主线程没有工作要做,则将执行异步调用的结果。
function f1() {
return new Promise((resolve, reject) => {
console.log('f1');
resolve();
});
}
function f2() {
console.log('f2');
}
f1().then(res => f2());
Run Code Online (Sandbox Code Playgroud)
如果
f1
是synchronous,则没有什么特别的:
global() {
f1();
f2();
}
Run Code Online (Sandbox Code Playgroud)
如果
f1
是异步的并返回一个Observable,请使用Rxjs operator
,如concatMap:
global() {
f1().concatMap(() => f2());
}
Run Code Online (Sandbox Code Playgroud)
如果
f1
是异步的并返回一个Promise,请使用async/await
:
async global() {
await f1();
f2();
}
Run Code Online (Sandbox Code Playgroud)
如果
f1
是异步的并返回一个Promise(替代):
global() {
f1().then(res => f2());
}
Run Code Online (Sandbox Code Playgroud)
小智 5
只需删除超时即可
function f1() {
return new Promise((resolve, reject) => {
console.log('i am first');
resolve();
});
}
function f2() {
console.log('i am second');
}
f1().then(f2);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
23009 次 |
最近记录: |