Javascript - 延迟 Promise 解析

标签 javascript promise

我有一项服务,可以产生一些确认警报并等待用户交互,由 Promise 管理。

如果在用户回答第一个确认警报之前生成了新的确认警报,则服务会将其存储在一种“等待列表”中,并在用户取消前一个确认警报后立即显示它

let waitList = []
let activeAlert = null;

function createAlert(){
   if(!activeAlert){
       let pr = new Promise((resolve, reject) => {
           // do stuff to show the alert
           if('user click ok') resolve();
           else reject();
       });
       activeAlert = pr;
       return pr;
   }
   else {
       let p = new Promise();
       waitList.push(p);
       return p;
   }
}

let alert = createAlert();
alert.then(()=>{
    // the user clicked OK
}).catch(()=>{
    // the user click CANCEL
});

let alert2 = createAlert();
alert2.then(()=>{
    // the user clicked OK on the second one
}).catch(()=>{
    // the user click CANCEL on the second one
});

我知道 Promise 反模式的概念,并且 Defer 对象已被弃用并被认为已过时。我无法理解如何为保存在数组中的 Promise 定义“解决”和“拒绝”条件。

最佳答案

如果不先保存一些引用,则无法从 promise 范围之外解析 promise 。如果您想从数组外部解决它们,您还应该将相关的解析和拒绝回调推送到对象中,以便可以从该范围之外使用它们。 例如:

let myRefHolder = {};
let toResolve = new Promise((res, rej) => {
    myRefHolder.resolutionCallback = res;
    //other code
});

然后在偶数处理程序中:

clickHandler = () => {
    myRefHolder.resolutionCallback(resolutionValue);
    //other code
}

然后你只需要稍微改变这个结构来适应你所有的 promise 和回调......而不是 myRefHolder对象,你可以有一个形状像 myRefHolders 的对象数组,每个 Promise 一次!

另一种方法是直接在 Promise 中分配按钮事件处理程序:

new Promise((rej, res) => yourButtonElement.addEventListener(‘click’, res));

当您点击按钮时,这个问题就会得到解决。除了 ref 之外,您还可以传递一个具有更复杂逻辑的更复杂的内联函数。 由于一个事件可以有多个处理程序,因此您可以继续为每个 Promise 添加该事件 - 但这可能会变得困惑,因为您必须在实际解决 Promise 之前删除监听器(我使用的示例 1 行代码可能会这样)泄漏内存,因为该处理程序保持事件状态,并阻止垃圾收集器释放 Promise 内存)

如果您问的是我如何然后/捕获一系列 promise 中的特定 promise ,那么就像 myArray[index].then(() => {}) 一样简单 如果您正在等待一系列 promise ,就像 Promise.all(myArray) 一样简单

关于Javascript - 延迟 Promise 解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50704718/

相关文章:

http - 在未经授权的异步请求上 Play Framework 服务器端重定向

javascript - 使用 php 添加事件类?

javascript - 子对象调用兄弟对象的方法

javascript - 删除数组的 "parent index of"的更好方法是什么?

javascript - 如何在 JavaScript 中添加 Promise 到事件处理程序

javascript - 已解决的 Promise 需要多长时间才能进入任务队列?

javascript - Python解析JavaScript生成的HTML表格

php - 不掉落在其他拖动上

javascript - 链接 Promise 错误处理程序

javascript - Promise 在 forEach 循环完成之前解析