javascript中的简单布尔承诺

时间:2017-11-08 13:51:36

标签: javascript promise

我对如何在javascript中创建一个简单的promise以充当方法已完成时的标志感到有点困惑。例如:

<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>
<script src="https://unpkg.com/vue@2.4.2"></script>
<div id="app">
  <debounce :debounce="250"></debounce>
</div>

我意识到我可以将所有内容放在const hasCompleted = Promise(false); // obviously not the way to create it const img = document.createElement('img'); img.src = data; img.onload = function(){ hasCompleted = Promise.resolve(true); }; hasCompleted.then(function(){ // continue... ); 回调中,但由于各种原因(其他依赖等),这不是一个选项。因此,我相信Promise是可行的方式。我看过的指南似乎让它变得比它需要的更复杂。以我所展示的方式使用承诺的最简单的方法是什么?感谢。

3 个答案:

答案 0 :(得分:3)

我认为你误解了Promises解决的问题。我明白,当你的承诺是&#34;真的&#34; (将在下面解释)函数传递给&#34;然后&#34;将执行,但不是Promises的工作方式。

承诺有两个州,&#34;解决&#34;并且&#34;拒绝&#34;,如果它&#34;解决&#34;,意味着您已经等待的异步值已经可用,则该函数传递给&#34;然后& #34;将被执行,但如果它&#34;拒绝&#34;,意味着发生了错误并且您等待的价值将无法获得,第一个&#34; catch&#34;在链中被称为。

我说&#34;链&#34;因为你可以使用尽可能多的&#34;然后&#34; s&#34;捕捉&#34; s。你好。

那就是说,我相信你在这里不需要承诺,只是一个简单的旗帜或者你onload内的某种回调。

创建承诺

您可以通过两种方式创建承诺,第一种方式只是来自文档:

new Promise(/* executor */ function(resolve, reject) { ... });

作为参数的函数接收两个函数,一个用于在异步值准备使用时调用 - resolve - 一个用于告诉链条发生错误 - reject

使用状态集创建承诺的另一种方法是使用Promise.reject()Promise.resolve()

等待没有Promise的异步值

等待加载某些内容的常见模式(如DOM元素)使用setIntervalif语句。不是说这是一个很好的模式......但这里是:

var intervalId = setInterval(() => {
    if (/* what you want is available? */) {
        clearInterval(intervalId);
    }
    /* use your value */
}, 500)

答案 1 :(得分:0)

我认为你不需要承诺。

您可以直接调用其他函数,也可以只将变量设置为true。

这会回答你的问题吗?

如果没有,请告诉我更具体的内容。

答案 2 :(得分:0)

const img = document.createElement('img');
const hasCompleted = new Promise((resolve, reject) => {
  img.src = data;
  img.onload = resolve;
  img.onerror = reject;
});

为了创建可以在以后解决的promise,可以使用new Promise构造函数并使用resolve参数执行某些操作。分配旧承诺不会有任何好处。