JavaScript的承诺:无法理解何时解决范围

水下握手

我一直在尝试不同的方法来解决结果不一致的Promise。我提供了两个代码段,但我不确定发生了什么变化,因此第一个成功解决,而第二个失败。

在第一次尝试中,我在Promise中包含了IIFE,resolve尽管我没有将IIFE传递给函数本身,但IIFE仍然可以识别结果已"test"成功记录到控制台:

const testFunction = function() {
  return new Promise(function(resolve) {
  !function() {
    resolve();
  }();
  });
};

!async function() {
  await testFunction();
  console.log('test');
}();

在下一个示例中,我创建了一个单独的函数,该函数在中调用Promise但是,resolve除非我定义该函数以接受参数,然后再进行传递,否则其他函数似乎不知道这什么resolve以下版本无法使用:

const printSomething = () => {
  resolve();
  }

const testFunction = function() {
  return new Promise(function(resolve) {
    printSomething();
  });
};

!async function() {
  await testFunction();
  console.log('test');
}();

我希望,由于与IIFE一样在printSomething内部运行testFunctionresolve因此可以使用。任何清除此问题的解释都将有所帮助。事先道歉,如果这实际上是对一般范围的理解的失败,而不是对承诺的特定理解。

jfriend00

resolve只是一个普通的javascript变量。就像任何其他javascript变量一样,它在词法范围之内或之外。因此,当您像这样使用它时:

function someFunc() {
    return new Promise(resolve => {
        let greeting = "hello";
        // resolve is in scope inside here, but nowhere else
        callSomething();
    });
}

function callSomething() {
   // resolve is not in scope here
}

它仅在promise executor函数内部。如果要在其他地方使用它,则必须将其传递给其他函数,就像处理任何其他本地Javascript变量一样。

它可以在您的IIFE中使用,因为它位于promise executor函数的内部,因此resolve可以在父作用域中找到。请记住,在Javascript中,作用域来自词汇定义,而不是堆栈或调用链。

它在您的printSomething()函数中不起作用,因为它不在同一词法范围内。

再举一个例子,resolve在范围内与greeting变量在范围内的位置相同它的行为相同。它对自己的作用域和任何子作用域都是私有的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

无法理解 javascript 中承诺的行为

来自分类Dev

无法理解dp解决方案

来自分类Dev

无法理解C中的文件范围

来自分类Dev

我无法理解 leetcode 70 中 javascript 的 DP 解决方案

来自分类Dev

无法理解Javascript中的指令

来自分类Dev

JavaScript无法理解俄语字母

来自分类Dev

Javascript - 无法理解函数括号

来自分类Dev

我无法理解和解决tkinter.tclerror

来自分类Dev

无法理解决策树参数的含义

来自分类Dev

无法理解此代码中变量的范围

来自分类Dev

无法理解范围解析运算符的使用

来自分类Dev

无法理解为什么for循环超出范围

来自分类Dev

无法理解如何决定何时使用Hidden()和何时使用HiddenFor()

来自分类Dev

无法理解递归

来自分类Dev

无法理解错误:

来自分类Dev

无法理解连接

来自分类Dev

无法理解的NullPointerException

来自分类Dev

无法理解错误

来自分类Dev

无法理解警告

来自分类Dev

无法理解错误

来自分类Dev

无法理解 if 命令

来自分类Dev

JavaScript难题:无法理解JavaScript中的parseInt结果

来自分类Dev

JavaScript-getElementById无法理解我的输入

来自分类Dev

无法理解在JavaScript中删除var的行为

来自分类Dev

Javascript的优点:无法理解方法array.push

来自分类Dev

Javascript-无法理解这一行代码

来自分类Dev

javascript中无法理解的对象重新分配

来自分类Dev

JavaScript-getElementById无法理解我的输入

来自分类Dev

无法理解 javascript 语法:if (parameter == "someValue") parameter = ""