我一直在尝试不同的方法来解决结果不一致的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
内部运行testFunction
,resolve
因此可以使用。任何清除此问题的解释都将有所帮助。事先道歉,如果这实际上是对一般范围的理解的失败,而不是对承诺的特定理解。
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] 删除。
我来说两句