Mar*_*rta 16 javascript asynchronous settimeout ecmascript-2017
我在Javascript中有一个异步函数,我添加了setTimeout.代码看起来像这样:
let timer;
clearTimeout(timer);
timer =setTimeout(() => {
(async() => {
await this._doSomething();
})();
}, 2000);
Run Code Online (Sandbox Code Playgroud)
setTimeout的puprose是在运行函数之前加2秒.确保用户停止输入.
我现在应该从此函数中删除async/await,因为setTimeout是异步的吗?
任何帮助在这里非常感谢!
jib*_*jib 37
setTimeout在函数调用之前添加一个延迟,而async/ await是在promises上的语法糖,一种在调用完成后链代码运行的方法,所以它们是不同的.
setTimeout具有可怕的错误处理特性,因此我建议在所有代码中使用以下内容:
let wait = ms => new Promise(resolve => setTimeout(resolve, ms));
Run Code Online (Sandbox Code Playgroud)
然后再也不要setTimeout直接打电话了.
您的代码现在变为:
let foo = async () => {
await wait(2000);
await this._doSomething();
}
Run Code Online (Sandbox Code Playgroud)
除了foo等待doSomething完成.这通常是可取的,但没有上下文,很难知道你想要什么.如果您打算doSomething与其他代码并行运行,我建议:
async () => { await Promise.all([foo(), this._otherCode()]); };
Run Code Online (Sandbox Code Playgroud)
在同一个地方加入和捕获错误.
如果你真的打算忘记_doSomething而不是等待它,你可能会失败await,但你应该尝试/捕获错误:
async () => {
let spinoff = async () => { try { await foo(); } catch (e) { console.log(e); } };
spinoff(); // no await!
}
Run Code Online (Sandbox Code Playgroud)
但我不推荐这种模式,因为它很微妙,很容易错过.
| 归档时间: |
|
| 查看次数: |
11578 次 |
| 最近记录: |