【问题标题】:Promise Callback :: What the fn(arr) does and what the last line of promise does? What is the logic behind it?Promise Callback :: fn(arr) 做了什么,promise 的最后一行做了什么?其背后的逻辑是什么?
【发布时间】:2020-06-13 06:27:41
【问题描述】:

我试图在这里理解承诺的逻辑。但我无法理解代码。

谁能帮我理解一下?

(r)=> fn = r, 在这段代码中是什么意思。

function promise(a,b) {

  return new Promise((resolve,reject) => {
      if(a%2 !== 0) {
        reject('ODD ');
        return;
      } 
      resolve('even');

  });

}

let list_of_promise = [ promise(1),promise(2)
,promise(2),promise(2),promise(2),promise(2)
,promise(2),promise(2),promise(2),promise(2)
,promise(2),promise(2),promise(2),promise(2),promise(2)
,promise(2),promise(2),promise(2),promise(2)
,promise(2)];



function listOfPromise(list_of_promise) {

  let arr = [];
  let fn;
  let count = 0;

  list_of_promise.map( (p) => {
    p.then((res)=>{
      arr.push(res);
      arr.length === 10 && fn(arr);
    });
  })

  return new Promise((r,rj) => fn= r);
}

listOfPromise(list_of_promise).then((res)=>{
  console.log("result set ", rest);
});

【问题讨论】:

  • 看起来像个穷人的Promise.all

标签: promise


【解决方案1】:

这是可怕的代码。

fn = r 只是将 resolve() 函数从 new Promise() 执行器分配到更高的范围,以便可以从执行器外部调用它,从而导致承诺解决。这是编写代码的一种非常迟钝的方式。从外部解决 Promise 的设计模式通常称为 Deferred。 99.999% 的情况下,不需要 Deferred 模式,并且有很多很好的理由说明为什么它没有内置到 Promise 架构中。如果你想看一个简单的 Deferred 对象,可以看herehere

要以一种不那么迟钝的方式重写它,我需要了解代码的目标是什么(就实际问题而言),这样我才能提出解决实际问题的最佳方法。现在,它看起来像是演示代码试图演示某些东西,而不是试图解决现实世界的问题。我更喜欢将编码重点放在现实世界的问题上,而不是理论讨论,因为现实世界的问题为实际的编码策略提供了优先级。

【讨论】:

  • 假设在现实世界中我正在浏览器中构建一个 Photoshop 应用程序,用户在浏览器中启动一个进程,该进程将启动需要在后端发送的 100/1000 次操作,然后再发送当响应返回时,我需要在浏览器中反映出来。
  • @user583726 - 这只是对 Promise 的正常使用。为此,不需要这些迟钝的机制。如果您想知道组的第一个承诺何时完成,请使用Promise.race()。如果您想知道它们何时完成,请使用Promise.all()。其他排列可以通过使用逻辑组合 Promise 来构建。我很高兴就我在这里做过数千次的代码提出一个现实问题的建议。如果不这样做,通常需要教授如何在各种情况下使用 Promise 的一般性,这超出了一个答案所能做的范围。
猜你喜欢
  • 2015-10-01
  • 1970-01-01
  • 2017-10-20
  • 2021-12-13
  • 2010-11-23
相关资源
最近更新 更多