【问题标题】:Are resolve and reject in Javascript promises methods or just some variables?Javascript Promise 方法中的 resolve 和 reject 是还是一些变量?
【发布时间】:2020-05-13 19:31:53
【问题描述】:

以下示例代码

var promise = new Promise(function(resolve, reject) { 
const x = "geeksforgeeks"; 
const y = "geeksforgeeks"
if(x === y) { 
    resolve(); 
} else { 
    reject(); 
} 
}); 

promise. 
    then(function () { 
        console.log('Success, You are a GEEK'); 
    }). 
    catch(function () { 
        console.log('Some error has occured'); 
    }); 

上面的代码工作正常。但是如果我只是执行作为参数传递给 Promise() 的函数,我会得到一个错误,说 resolve 不是一个函数。

(function(resolve, reject) { 
const x = "geeksforgeeks"; 
const y = "geeksforgeeks"
if(x === y) { 
  resolve(); 
} else { 
  reject(); 
} })()

如果我运行上面的代码,我会得到以下错误

Uncaught TypeError: resolve is not a function

有人能解释一下这是如何工作的吗?

【问题讨论】:

  • @ScottMarcus 不,传递给执行器回调的两个解析器函数不是方法。
  • 在 Javascript(独立于 Promise)中,你不能仅仅为函数编写参数并期望它们是有效的,除非调用函数的人传递了这些参数。在您的第二个示例中,没有任何内容传递给您的函数,因此resolverejectundefined。在正常的 Promise 用法中,new Promise() 的内部将为 resolvereject 参数传递一个函数。因此,当您调用它们时,您正在调用 new Promise() 构造函数传递给您的回调的函数。您的第二个代码示例没有向函数传递任何内容。
  • 我看到 jfriend00 解释的混乱,但我并不真正理解 OP 的逻辑。是否有一种语言可以让匿名函数自动将参数填充为可调用函数,这些函数取自内置的内部变量(或者在这种情况下是私有的非公开方法)?
  • @Bergi 我误解了这个问题。我指的不是传递的函数。我指的是Promise API。

标签: javascript ecmascript-6 javascript-objects es6-promise


【解决方案1】:

resolvereject 来自 Promise 对象,但它们不是方法。 Promise 构造函数看起来像这样:

class Promise {
  // handler should look like (resolve, reject) => {}
  constructor(handler) {
    function resolve(value) { /***/ }
    function reject(err) { /***/ }

    handler(resolve, reject);
  }
}

当您使用函数类型的处理程序调用 new Promise(handler) 时,处理程序会获取 用两个函数调用。当您调用不带参数的同一个处理程序时,处理程序 尝试调用 undefined,这就是您看到 TypeError 的原因。

【讨论】:

    【解决方案2】:

    在第一种情况下,该函数由Promsie 对象调用,并带有所需的参数resolvereject,这将是函数。

    在您立即调用函数的第二种情况下它不起作用的原因是您没有将函数传递给调用:

    (function(resolve, reject) { 
    const x = "geeksforgeeks"; 
    const y = "geeksforgeeks"
    if(x === y) { 
      resolve(); 
    } else { 
      reject(); 
    } })(resolveFunctionHere, rejectFunctionHere) <----- HERE
    

    【讨论】:

      猜你喜欢
      • 2019-01-20
      • 2017-11-09
      • 1970-01-01
      • 1970-01-01
      • 2019-04-07
      • 2015-11-15
      • 1970-01-01
      • 2021-11-05
      • 2018-01-16
      相关资源
      最近更新 更多