在NativeScript-vue中异步/等待。为什么对话框无法以正确的顺序显示?

时间:2019-11-14 16:00:43

标签: android vue.js async-await nativescript nativescript-vue

如何在nativescript-vue中使用等待同步? 下面的Vue代码在浏览器中以正确的顺序显示,但是在nativescript中更改对话框的顺序。 有人能猜出这是怎么回事吗?

工作Vue代码

async start() {
      await this.speak("first");
      this.answer = await this.ask("question");
      await this.speak(this.answer);
    },

使用本地脚本时,相同的代码现在确实以正确的顺序显示对话框。 Confirm()方法始终首先显示。

var app = new Vue({
  el: '#app',
  data: {
    message: "starting point",
    answer: " "

  },
  methods: {
    async start() {
      await this.speak("first");
      this.answer = await this.ask("question");
      await this.speak(this.answer);
    },
    speak(incoming) {
      this.message = incoming + " speech";
      alert(incoming);
    },
    ask(incoming) {
      this.answer = prompt(incoming);
      this.message = this.answer + " was the answer ";
      return this.answer;
    }
  }
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>

<div id="app">
  <h2>{{ message }}</h2>
  <button @click="start">Start</button>
</div>

Edit sync-await-test

1 个答案:

答案 0 :(得分:1)

这是因为Web浏览器中的警报对话框会阻止在主线程上运行的所有其他JavaScript代码。此外,alert(...)在Web上返回void。

在NativeScript alert(...)中返回一个保证可确保对话框关闭的Promise。在{N}中执行相同的代码时,它不会等待alert(...)对话框关闭,因为您没有返回承诺。

speak(incoming) {
  this.message = incoming + " speech";
  return alert(incoming);
},