Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么承诺被设计为立即在内部执行_Javascript_Promise_Es6 Promise - Fatal编程技术网

Javascript 为什么承诺被设计为立即在内部执行

Javascript 为什么承诺被设计为立即在内部执行,javascript,promise,es6-promise,Javascript,Promise,Es6 Promise,根据MDN: 承诺实现立即执行executor函数,传递resolve和reject函数 做出这一决定的实际原因是什么? 为什么承诺不懒惰 做出这一决定的实际原因是什么 带有回调的Promise构造函数只是一个例子。回调决不是为了在计算时间内提供选择,它应该为解析器函数提供一个具有错误处理的作用域 为什么承诺不懒惰 因为承诺表示异步结果值,所以仅此而已。它们保持简单,没有懒散的特点(并且表示整个计算,使用启动/重复/等方法)。您可以通过使用返回承诺的函数来实现这一点。承诺意味着提供延续,而标准p

根据MDN:

承诺实现立即执行executor函数,传递resolve和reject函数

做出这一决定的实际原因是什么? 为什么承诺不懒惰

做出这一决定的实际原因是什么

带有回调的
Promise
构造函数只是一个例子。回调决不是为了在计算时间内提供选择,它应该为解析器函数提供一个具有错误处理的作用域

为什么承诺不懒惰


因为承诺表示异步结果值,所以仅此而已。它们保持简单,没有懒散的特点(并且表示整个计算,使用启动/重复/等方法)。您可以通过使用返回承诺的函数来实现这一点。

承诺意味着提供延续,而标准
promise
对象的实际状态提出了以下模式:

function doStuff() {
    return new Promise((resolve, reject) => { // execution function
         // Do stuff here
    });
}
我会问自己一个问题,以理解为什么会立即调用
Promise
的执行函数:在哪里做承诺的事情?


很明显,它被称为“立即”,因为你承诺某些事情会成功或失败,调用封闭函数时,应该立即开始处理这些内容,以避免调用者感到困惑。

承诺的要点是从函数返回一些东西,调用者可以将回调附加到该函数,而不是将它们传入。构造函数是回答“为什么”的一条红鲱鱼,因为它的存在仅仅是为了在一个不完美的世界中包装旧的回调风格代码

所有JS函数都是同步的,即使是那些返回承诺的函数(es8是语法糖)

Promise构造函数executor函数的存在是为了提供统一的错误处理。考虑:

function foo() {
  ""(); // throws TypeError
  return Promise(resolve => {
    ""(); // rejects promise with TypeError
  });
}
调用方需要
try{foo().catch(failed);}catch(e){failed(e);}
=Sucks

因此,将所有同步代码放在executor函数中,以统一调用者的错误。这就是为什么,我想这才是你真正的问题


“懒惰”执行将无法达到统一所有代码错误处理的目的。

您的问题似乎适用于“懒惰”承诺在某些方面会更优越,但您忽略了指定这是什么方式。在您看来,懒惰的承诺实现是什么样子的?有什么好处呢?我想,并考虑了很长一段时间,承诺是懒惰的(直到有事情发生时才被评估,然后才被评估)。我认为这只是“更简单”的方式异步接口的要点是现在开始一个操作,然后在将来的某个时候,当它完成时,您可以通知感兴趣的各方它的结果。因此,executor函数的作用是使您能够立即启动异步操作(无需等待)。这里有一个注释,说明了为什么承诺不会懒惰。如果您认为懒惰的承诺会更简单,那么您显然希望将承诺用于与99.99%的编程人群不同的东西。这些不是承诺。这是一个完全不同的范例。您可以在实现中非常简单地使用承诺来做您想要做的事情(使用承诺来跟踪异步操作,并使用您自己的包装器来决定何时实际触发异步操作),但这并不是承诺,也不是曾经的承诺,如果这样设计,它们会更好,这是不正确的。问题是,例如,你不能使用一堆这样的函数作为Promise的参数。all(在Bluebird实现中)@RaxWunter你是在说生成器吗?@Rax你不会将函数本身传递给
Promise。all
,你会传递函数的结果。是的,我明白你的意思,对于控制执行顺序来说,使用生成器更为自然,但如果承诺是懒惰的,我们也可以使用它们。@RaxWunter是的,事实上我并不是说这会很糟糕,但无论如何,承诺模式中的懒惰意味着什么?除非调用
,然后调用
,否则操作不会被处理?我不会说这里的简单性是好的,因为我认为它不会解决任何问题。我想看看立即执行lazy-one的一些优点最简单的优点是:因为确定何时强制使用lazy值很困难。有很多种可能性,但没有一种是通用的。我认为很明显可以使用
然后
或任何其他附加方法。仍然没有那么强大的优势如果
那么
在对象上被多次调用会怎么样?是否多次执行该任务?不,这不是应该的工作方式。你说得对,让它懒惰没有什么好处。来吧,这是完全可行的。相同的机制+仅解决一次