为什么不打印 isGuest 的控制台。我得到输出,因为 Id 是 1


function getGuestUserID(v)
{console.log('The Id is',v)};
function isGuest(val){ console.log('hl') 
return false};
function err(e) { console.log("error", e); }
Promise.resolve(1).then(isGuest && getGuestUserID).catch(err);

您从不调用isGuest函数,也不会将其用作传递给.then()方法的参数。函数的参数在调用.then()方法之前首先进行求值,因此您的代码类似于:

const thenFn = isGuest && getGuestUserID;
Promise.resolve(1).then(thenFn).catch(err);

因为isGuest是一个函数对象,所以它是共序truthy,所以thenFn被分配给getGuestUserID函数。请注意,在这种情况下,您没有调用isGuest()方法。

相反,您可以创建一个回调函数,在Promise解析时为您处理此问题:

Promise.resolve(1).then((v) => isGuest(v) && getGuestUserID(v)).catch(err);

或者您可以使用if语句使其可读性更强:

Promise.resolve(1).then((v) => {
if(isGuest(v))
return getGuestUserID(v);
}).catch(err);

以上两个例子的返回内容略有不同。因此,根据您的用例,您可能需要记住这一点。

创建承诺链的代码是同步执行的。以下语句

Promise.resolve(1).then(isGuest && getGuestUserID).catch(err);

执行如下:

  1. JavaScript引擎调用Promise.resolve(1),返回一个用数字1实现的承诺
  2. 对参数表达式isGuest && getGuestUserID进行求值,这在JavaScript中产生值getGuestUserID,即函数对象
  3. 在步骤1中创建的promise的then方法是用getGuestUserID作为参数调用的
  4. 由于promise已经实现,then方法代码将一个作业放在promise作业队列中,以promise的已实现值1作为参数来调用then的第一个参数(getGuestUserID(
  5. 从步骤3中的then调用返回的promise的catch方法使用参数err(一个函数(进行调用。此调用返回一个未使用的promise
  6. 执行在Promise链语句之后继续,可能执行它之后的同步代码,然后将控制权返回到事件循环的任务管理组件
  7. Promise Job Queue中的任何作业都是在FIFO的基础上执行的,其中包括步骤4中放入的作业
  8. Promise作业执行使用参数1调用getGuestUserID;id是1〃;在控制台上

如果对挂起的承诺调用then,则步骤4中描述的将作业放入承诺作业队列的部分在调用then时不会发生,并且会延迟到承诺实际实现或拒绝(因此不再挂起(时(以及如果(。

相关内容

  • 没有找到相关文章

最新更新