javascript - Chrome : Invoking 'alert()' during microtask execution is deprecated and will be removed

标签 javascript ajax google-chrome axios

在处理我的网络应用程序时,特别是文件上传时,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 发布我的代码将无法工作。请注意,我没有将警报发送到生产环境,但对于测试它非常有值(value)。

情况:

我正在使用 React 在 typescript 中开发我的应用程序。我正在使用 axios做http请求。基本上 http-post 看起来像这样:

axios.post("/upload/", data)
    .then((response: any) => {
        callback(undefined);
    })
    .catch((error: any) => {
        callback(error);
    });

然后在调用方法中,如果出现错误,我会弹出一个警报,这样我就可以确定测试人员/开发人员会收到通知。有点像这样:

this.service.uploadFile((error: any) => {
    if (error) {
        console.log(error);
        alert("An error occured");
        return;
    }

    this.onUploadCompleted()
});

这是 chrome 显示警告的时候。

首先,我想知道警告是否合理,因为警告会在请求完成并返回错误之前显示。所以我很确定它没有阻止任何东西。

如果合理,我可以做些什么来显示警报?

最佳答案

是的,警告是合理的:您在微任务中调用 alert,在本例中是 promise 完成。 (参见 Difference between microtask and macrotask within an event loop context。)

alertpromptconfirm 是很久以前的遗物,它们有一个问题:它们完全中断了正常工作JavaScript 并且可以说通过完全暂停执行违反了它的运行到完成语义,就在作业队列中的作业(或事件循环中的任务;JavaScript 和 HTML5 规范在术语上不同)的中间,并在中执行 UI阻塞模式的形式。这与基于事件的一般交互模式不一致(显示消息,在关闭时获取事件)。

您可以通过在任务中执行alert 来解决这个问题:

this.service.uploadFile((error: any) => {
    if (error) {
        setTimeout(() => {
            console.log(error);
            alert("An error occured");
        }, 0);
        return;
    }

    this.onUploadCompleted()
});

...但真正的解决方案是完全停止使用alertpromptconfirm


这是微任务和宏任务的一个有趣示例: promise 完成是一个微任务,而计时器回调是宏任务。脚本的初始运行也是一个宏任务,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

....如果所有任务都是平等的,我们就会得到。

关于javascript - Chrome : Invoking 'alert()' during microtask execution is deprecated and will be removed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39139542/

相关文章:

javascript - 如何在 EJS 中创建和使用 onclick 函数

html - jQuery 日期选择器不适用于 AJAX 添加的 html 元素

PHP socket_connect() 权限被拒绝

php - 检测更改的字段并通过 jquery 和 ajax 发送

javascript - 在焦点元素上按下转义键时不会引发键事件

javascript - 垂直对齐 float div 内的 img

JavaScript 源路径

python-3.x - cookie sqlite错误1555如何解决? ( python 和 Selenium )

javascript - React 组件中未定义的某些对象属性

Javascript 一次设置 Var