javascript – 如何在返回新Promise之前等待Promise解决?

我正在构建一个用于创建零售标牌的Web应用程序. Firestore保存有关标志的信息,如果用户点击“删除所有标志”,我希望能够删除所有标志.然后会出现一个对话框,要求用户确认删除数据库中的所有标志.如果他们确认,那么应该从Firestore中删除所有标志.

每个符号的文档ID存储在名为signIds的数组中.我希望能够遍历signIds并从Firestore中的signs集合中删除每个文档.一旦所有Promise都解决了,我想返回一个Promise并在mount()中的事件处理程序中解析它.

我已经尝试在代码中的不同位置返回Promise,但无济于事.我也试过使用async和await,但似乎有同样的问题.

data() {
        return {
            signIds: [],}
},methods: {
    showModal(message,type) {
        this.$root.$emit('openModal',{
            closed: false,text: message,type: type
        })
    },emptyQueue() {
        let self = this;
        let deleted = 0;

        for (let id of self.signIds) {
            database.collection("signs").doc(id).delete()
                .then(() => {
                    console.log("Document successfully deleted!");
                    deleted++;
                }).catch((error) => {
                    console.error("Error removing document: ",error);
                });
        }

        // Once all signs are deleted,return new Promise
        return new Promise((resolve,reject) => {
            return (deleted === self.signIds.length) ? resolve() : reject(new Error('An error occurred while deleting signs.'));
        });
    }      
},created() {
        // Get and store the document id for each sign
        database.collection("signs").get()
            .then(snapshot => {
                snapshot.forEach(doc => {
                    this.signIds.push(doc.id);
                })
            });
    },mounted() {
        // When the user clicks 'OK' on the dialog,delete all signs from the database
        this.emptyQueue()
            .then(() => {
                setTimeout(function() {
                    self.showModal('All signs were successfully removed.','success');
                },300);
            }).catch(() => {
                setTimeout(function() {
                    self.showModal('An error has occurred. Some signs were not removed.','error');
                },300);
            })
        }

我希望新的Promise在Firestore的Promise解决之后返回,但是现在新的Promise在for循环结束后立即返回.

解决方法

您通过signIds的Promises进行的当前迭代不会被其他任何东西链接 – .delete()Promise目前没有在任何地方使用.最好将每个id映射到数组中的Promise,然后在该数组上使用Promise.all.如果在消费者中处理错误,则不需要捕获emptyQueue只是为了抛出一个新错误 – 而只是单独返回Promise链,并避免使用 explicit Promise construction anti-pattern

emptyQueue() {
  return Promise.all(
    this.signIds.map(id => (
      database.collection("signs").doc(id).delete()
    ))
  );
}

如果任何一个.delete()调用导致错误,那么该错误将渗透到您的错误

this.emptyQueue()
  // ...
  .catch(() => {
    ...
  });

部分自动通过Promise.all.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


kindeditor4.x代码高亮功能默认使用的是prettify插件,prettify是Google提供的一款源代码语法高亮着色器,它提供一种简单的形式来着色HTML页面上的程序代码,实现方式如下: 首先在编辑器里面插入javascript代码: 确定后会在编辑器插入这样的代码: <pre
这一篇我将介绍如何让kindeditor4.x整合SyntaxHighlighter代码高亮,因为SyntaxHighlighter的应用非常广泛,所以将kindeditor默认的prettify替换为SyntaxHighlighter代码高亮插件 上一篇“让kindeditor显示高亮代码”中已经
js如何实现弹出form提交表单?(图文+视频)
js怎么获取复选框选中的值
js如何实现倒计时跳转页面
如何用js控制图片放大缩小
JS怎么获取当前时间戳
JS如何判断对象是否为数组
JS怎么获取图片当前宽高
JS对象如何转为json格式字符串
JS怎么获取图片原始宽高
怎么在click事件中调用多个js函数
js如何往数组中添加新元素
js如何拆分字符串
JS怎么对数组内元素进行求和
JS如何判断屏幕大小
js怎么解析json数据
js如何实时获取浏览器窗口大小
原生JS实现别踩白块小游戏(五)
原生JS实现别踩白块小游戏(一)