Chrome:在微任务执行期间调用 'alert()' 已弃用并将被删除
Chrome: Invoking 'alert()' during microtask execution is deprecated and will be removed
在我的网络应用程序上工作时,特别是文件上传,Chrome 在我发出警报后显示警告:
Invoking 'alert()' during microtask execution is deprecated and will be removed in M53, around September 2016. See https://www.chromestatus.com/features/5647113010544640 for more details.
但是我认为在我的情况下调用是合理的并且我有点担心一旦 M53 发布我的代码将无法工作。请注意,我没有将警报发送到生产环境,但对于测试它非常有价值。
情况:
我正在使用 React 在打字稿中开发我的应用程序。我正在使用 axios 来执行 http 请求。基本上 http-post 看起来像这样:
axios.post("/upload/", data)
.then((response: any) => {
callback(undefined);
})
.catch((error: any) => {
callback(error);
});
然后在调用方法中,如果出现错误,我会弹出一个警报,这样我就可以确定 tester/developer 会收到通知。有点像这样:
this.service.uploadFile((error: any) => {
if (error) {
console.log(error);
alert("An error occured");
return;
}
this.onUploadCompleted()
});
这是 chrome 显示警告的时候。
首先,我想知道警告是否合理,因为警告会在请求完成并返回错误之前显示。所以我很确定它没有阻止任何东西。
如果有道理,我可以怎样做才能显示警报?
是的,警告是合理的:您在微任务中调用 alert
,在本例中是承诺完成。 (参见 Difference between microtask and macrotask within an event loop context。)
alert
、prompt
和confirm
是很久以前的遗物,它们有一个问题:它们完全打断了JavaScript和JavaScript的正常工作可以说,在作业队列中的作业(或事件循环中的任务;JavaScript 和 HTML5 spec 在术语上有所不同)并以阻塞模式的形式执行 UI。这与基于事件的一般交互模式不一致(显示消息,关闭时获取事件)。
您可以通过在 宏 任务中执行 alert
来解决此问题:
this.service.uploadFile((error: any) => {
if (error) {
setTimeout(() => {
console.log(error);
alert("An error occured");
}, 0);
return;
}
this.onUploadCompleted()
});
...但真正的解决方案是完全停止使用 alert
、prompt
和 confirm
。
这是微任务和宏任务的一个有趣示例:承诺完成是一个 微任务 ,而计时器回调是 宏任务 。脚本的初始 运行 也是一个宏任务,DOM 事件回调也是如此。宏任务排队的所有微任务在运行 之前下一个宏任务是运行;例如,他们插队。所以有了这个:
// First, we set a timer callback for 0ms
setTimeout(() => {
console.log("timer fired");
}, 0);
// Now we get a promise that's *already* resolved and hook a callback
Promise.resolve().then(() => {
console.log("promise resolved");
});
// Now show a message demonstrating we got here before the promise resolution callback
console.log("got to the end");
...我们看到了
got to the end
promise resolved
timer fired
...而不是
got to the end
timer fired
promise resolved
..如果所有任务都是平等的,我们就会得到。
在我的网络应用程序上工作时,特别是文件上传,Chrome 在我发出警报后显示警告:
Invoking 'alert()' during microtask execution is deprecated and will be removed in M53, around September 2016. See https://www.chromestatus.com/features/5647113010544640 for more details.
但是我认为在我的情况下调用是合理的并且我有点担心一旦 M53 发布我的代码将无法工作。请注意,我没有将警报发送到生产环境,但对于测试它非常有价值。
情况:
我正在使用 React 在打字稿中开发我的应用程序。我正在使用 axios 来执行 http 请求。基本上 http-post 看起来像这样:
axios.post("/upload/", data)
.then((response: any) => {
callback(undefined);
})
.catch((error: any) => {
callback(error);
});
然后在调用方法中,如果出现错误,我会弹出一个警报,这样我就可以确定 tester/developer 会收到通知。有点像这样:
this.service.uploadFile((error: any) => {
if (error) {
console.log(error);
alert("An error occured");
return;
}
this.onUploadCompleted()
});
这是 chrome 显示警告的时候。
首先,我想知道警告是否合理,因为警告会在请求完成并返回错误之前显示。所以我很确定它没有阻止任何东西。
如果有道理,我可以怎样做才能显示警报?
是的,警告是合理的:您在微任务中调用 alert
,在本例中是承诺完成。 (参见 Difference between microtask and macrotask within an event loop context。)
alert
、prompt
和confirm
是很久以前的遗物,它们有一个问题:它们完全打断了JavaScript和JavaScript的正常工作可以说,在作业队列中的作业(或事件循环中的任务;JavaScript 和 HTML5 spec 在术语上有所不同)并以阻塞模式的形式执行 UI。这与基于事件的一般交互模式不一致(显示消息,关闭时获取事件)。
您可以通过在 宏 任务中执行 alert
来解决此问题:
this.service.uploadFile((error: any) => {
if (error) {
setTimeout(() => {
console.log(error);
alert("An error occured");
}, 0);
return;
}
this.onUploadCompleted()
});
...但真正的解决方案是完全停止使用 alert
、prompt
和 confirm
。
这是微任务和宏任务的一个有趣示例:承诺完成是一个 微任务 ,而计时器回调是 宏任务 。脚本的初始 运行 也是一个宏任务,DOM 事件回调也是如此。宏任务排队的所有微任务在运行 之前下一个宏任务是运行;例如,他们插队。所以有了这个:
// First, we set a timer callback for 0ms
setTimeout(() => {
console.log("timer fired");
}, 0);
// Now we get a promise that's *already* resolved and hook a callback
Promise.resolve().then(() => {
console.log("promise resolved");
});
// Now show a message demonstrating we got here before the promise resolution callback
console.log("got to the end");
...我们看到了
got to the end promise resolved timer fired
...而不是
got to the end timer fired promise resolved
..如果所有任务都是平等的,我们就会得到。