我对如何在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是可行的方式。我看过的指南似乎让它变得比它需要的更复杂。以我所展示的方式使用承诺的最简单的方法是什么?感谢。
答案 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()
。
等待加载某些内容的常见模式(如DOM元素)使用setInterval
和if
语句。不是说这是一个很好的模式......但这里是:
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
参数执行某些操作。分配旧承诺不会有任何好处。