如何正确履行诺言

时间:2019-05-23 14:29:22

标签: javascript promise async-await

我不确定我做的是否正确。根据某些变量集,我有一系列响应。我想兑现承诺,以便他们完成应用程序后再运行下一行代码。这是我的代码:

const promises = []

if (this.score >= this.scoreNeeded) {
  this.correct = true
  this.retrieveCode(this.clueorder)
  this.feedback = 'Congrats you are moving on. Here is your next code '
} else {
  console.log('1')
  if (locimgface && !this.smile) {
    this.feedback += 'You need to smile in your picture. '
  }
  if (locimgfacesurprise && !this.surprise) {
    this.feedback += 'You need to look very surprised in your picture. '
  }
  if (locimgfacesorrow && !this.sorrow) {
    this.feedback += 'You need to look really sad in your picture. '
  }
  if (locationimagetexton && !this.atLocation) {
    this.feedback += 'We could not find the text in the image. It needs to have one of these words "' + locationimagetextwithspaces + '" somewhere in the picture. '
  }
  if (locationimagelabelon && !this.foundItem) {
    this.feedback += 'We could not find the item in the image. It needs to have one of these items "' + locationimagelabelswithspaces + '" somewhere in the picture. '
  }

  promises.push(this.feedback)

  Promise.all(promises).then(() => {
    console.log('completed from promise');
    this.deleteImage(this.fullPath)
  }).catch(err => {
    console.log(`ERROR: ${JSON.stringify(err)}`);
  })
}

我想做的是确保所有反馈消息均已正确设置,然后运行deleteImage函数,此外在代码块中获得了良好的成绩,我想在发布代码之前等待来自retrieveCode的响应。反馈。

一如既往,所有帮助都将受到赞赏。

更新:

我可能做错了,但是有多个触发器。

如果代码缺少一个或多个,则需要让用户知道缺少的内容,即程序正在寻找微笑,并且一些文本和图片与文本一起提交但没有微笑,用户应该得到反馈消息,让他们知道他们需要在图片中微笑。

如果程序正在寻找令人惊讶的外观,文字和标签,并且用户提交了带有令人惊讶的外观和文字的图片,则他们将收到一条反馈消息,告知他们需要包含标签。

如果程序正在寻找微笑,文本和标签(“汽车”),并且用户提交的图片都不包含这些内容,则他们会收到一条反馈消息,表示需要微笑,他们需要提供缺少的文本他们需要在图片中有辆车。

对于缺少的每个项目,都会向用户提供具体的反馈,以帮助他们。

最终目标是构建反馈消息,然后运行下一个功能。取决于用户的得分,可以是deleteImage()或retrieveCode()

更新2

这是deleteImage函数

deleteImage (fullPath) {
        console.log('2')
        let storage = firebase.storage();
        let storageRef = storage.ref();

        // Create a reference to the file we want to delete
        let imageRef = storageRef.child(fullPath);
        imageRef.delete().then(() => {
            console.log('3')
            this.reset()
        })
        .catch((error) => {
            console.error(`file delete error occurred: ${error}`)
        })
    },

更新3:

这是retrieveCode()函数。

retrieveCode(clueorder) {
    // get the next clue by adding 1 to this clue
    const newclue = this.getNextClue(clueorder)

    this.$store.dispatch('retrieveCode', {
        newclue: newclue,
        oldclue: clueorder
    });
}

1 个答案:

答案 0 :(得分:1)

MDN页上:

  

Promise.all()方法返回一个Promise,当作为可迭代对象传递的所有promise已解决或可迭代对象不包含promise时,该Promise就会解决。

基本示例

让我们创建一个真正的基本函数,该函数返回一个Promise(使用Promise.resolve),该函数返回您传递的字符串。

// You could use new Promise(resolve => resolve(str));
const fetchData = str => Promise.resolve(str)

// Array of promises to wait on
const data = [
    fetchData('foo'),
    fetchData('bar'),
    fetchData('baz')
];

Promise.all(data).then(responses => {
    console.log(responses);
});

您也不必返回Promises,只需传递一个字符串数组,Promise.all就会“解析”这些字符串。

// You could use new Promise(resolve => resolve(str));
const fetchData = str => str

// Array of promises to wait on
const data = [
    fetchData('foo'),
    fetchData('bar'),
    fetchData('baz')
];

Promise.all(data).then(responses => {
    console.log(responses);
});