【问题标题】:What is the difference between Promise((resolve,reject)=>{}) and Promise(resolve =>{})?Promise((resolve,reject)=>{}) 和 Promise(resolve =>{}) 有什么区别?
【发布时间】:2019-01-20 10:48:53
【问题描述】:

正如我们所知,Promise 构造函数采用一个执行器函数,该函数具有两个参数,我们使用它们来生成成功案例或失败案例。今天我在编程,我被卡住了,但后来我解决了这个问题,但我发现了需要理解的一件事。

有什么区别

new Promise(resolve => {

    // resolve

});

new Promise((resolve,reject)=>{

    // resolve
    // reject

});

我们可以这样做吗?

new Promise(resolve => {

    // resolve

}, reject => {

    // reject

});

示例将不胜感激。谢谢!!!

【问题讨论】:

  • can we do like this? 不。
  • @JonasWilms - 一件事现在很清楚。谢谢你:)
  • 您不能将解析和拒绝操作分开,两者应该在同一个上下文中使用,(resolve, reject) 是回调变量,应该在同一个函数中使用以执行这些回调。

标签: javascript es6-promise


【解决方案1】:

这不是特定于 Promises 的,只是回调函数。

new Promise((resolve) => {});1 创建一个 Promise,其回调只接受 resolve 参数。无法调用本应提供的拒绝函数。2

new Promise((resolve, reject) => {}); 创建一个 Promise,其回调接受两个参数,包括用于拒绝的参数。

以上两个示例演示了位置参数的工作原理。回调函数中的第一个参数永远是resolve函数,第二个永远是reject函数。

new Promise((reject, resolve) => {}); 将创建一个 Promise,您可以在其中使用 reject 解决并使用 resolve 拒绝。

您可以在回调函数的范围内使用throwresolve(Promise.reject()) 来导致拒绝发生:

new Promise((resolve) => {
  throw new Error("42");
  // or `resolve(Promise.reject(new Error("42")));`
})
  .catch(console.warn); // Prints warning “Error: "42"” in the console.

您不能使用new Promise((resolve) => {}, (reject) => {});,因为Promise 构造函数只接受一个参数。第二个回调函数将被忽略。


1(resolve) => {} 当然等同于resolve => {}。但箭头函数参数实际上总是需要括号。简单和单一的参数是唯一的例外,它们可以被省略。请参阅MDN article about arrow function syntax

2:使用常规函数 new Promise(function(resolve){});new Promise(function(){}); 您可以使用 access any argumentarguments[0] (resolve) 或 arguments[1] (拒绝)。

【讨论】:

  • 1b) 回调中的某人throws,或resolve(Promise.reject())
  • 如果我喜欢这个 new Promise(resolve,reject => {})。对吗?
  • @DhuBytes 你必须用 () 包装 2 个逗号分隔的参数,以防你有多个参数,例如 (resolve,拒绝)=> {}
  • @DhuBytes 否。箭头函数参数总是需要用括号括起来,除非只有一个参数。 new Promise(resolve, reject => {}) 是一个 Promise,它将现有变量 resolve 作为执行者,将忽略函数 (reject) => {}
  • 所以这意味着当我们执行类似 abc => {} 的操作时,这意味着 abc 是函数参数。如果我们需要多个参数,我们必须这样做 (abc,def,...) => {}。因此,在一个参数的情况下,括号可以省略,但在多个参数的情况下,括号是必需的。对吧?
【解决方案2】:

好吧,忘记承诺,如果任何具有一个参数的函数使用两个参数调用,那么与 JavaScript 标准一样(反之亦然)是没有问题的。

现在,与您的承诺相关,您传递给构造函数的回调将被 2 个参数(解析器函数和拒绝器)调用。如果您创建具有 1 个参数的函数并将其传递给 Promise 的构造函数,它只会被 2 个参数调用,因为您没有引用第二个参数,您不能以它应该是用户的方式使用它(作为通用语句而不是为了承诺)。

如果你仍然需要第二个参数,你仍然可以尝试使用arguments,但是使用arrow 函数你也不会得到那个。在这种情况下,最好使用普通的function () {}。否则,您可以尝试使用 Promise.resolvePromise.reject 显式返回另一个承诺

最后一个带有多个回调作为 Promise 构造函数参数的最后一个肯定不起作用,因为它的设计就像一个带有 2 个参数的回调。

【讨论】:

    【解决方案3】:

    你传递的箭头函数是异步操作结束时触发的回调。 它接受 2 个参数,成功时调用的函数 (resolve) 和失败时调用的函数 (reject)。

    在 JS 中,您不必将所有参数传递给函数回调。如果你不打算处理错误(你应该处理!),你可以省略它。

    如果你传递了 1 个参数,它被认为是一个解析 fn。

    【讨论】:

      【解决方案4】:

      如果您知道承诺永远不会失败,例如计时器,则可以省略 reject。任何需要错误处理程序(http 请求、文件 i/o 等)的东西都需要 reject 回调。

      【讨论】:

      • 好的,如果我们传递一个函数,那么它将被视为 promise 构造函数中的解析函数?
      • 是的,您传递给Promise 构造函数的函数的第一个参数是解析处理程序。第二个参数(拒绝处理程序)是可选的。
      • 如果我喜欢这个新的 Promise(resolve,reject => {})。对吗?
      • 您需要在resolve,reject 周围加上一些括号,但除此之外很好(当然,假设您会在{} 之间添加一些代码)。所以:new Promise((resolve,reject) => { resolve(getSomeValue()); })
      • 所以这意味着当我们执行类似 abc => {} 的操作时,这意味着 abc 是函数参数。如果我们需要多个参数,我们必须这样做 (abc,def,...) => {}。因此,在一个参数的情况下,括号可以省略,但在多个参数的情况下,括号是必需的。对吧?
      猜你喜欢
      • 2011-11-30
      • 2018-10-10
      • 2019-04-07
      • 2015-11-15
      • 2019-09-15
      • 1970-01-01
      • 2017-05-17
      • 2017-11-09
      • 1970-01-01
      相关资源
      最近更新 更多