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);
执行如下:
- JavaScript引擎调用
Promise.resolve(1)
,返回一个用数字1
实现的承诺 - 对参数表达式
isGuest && getGuestUserID
进行求值,这在JavaScript中产生值getGuestUserID
,即函数对象 - 在步骤1中创建的promise的
then
方法是用getGuestUserID
作为参数调用的 - 由于promise已经实现,
then
方法代码将一个作业放在promise作业队列中,以promise的已实现值1
作为参数来调用then
的第一个参数(getGuestUserID
( - 从步骤3中的
then
调用返回的promise的catch
方法使用参数err
(一个函数(进行调用。此调用返回一个未使用的promise - 执行在Promise链语句之后继续,可能执行它之后的同步代码,然后将控制权返回到事件循环的任务管理组件
- Promise Job Queue中的任何作业都是在FIFO的基础上执行的,其中包括步骤4中放入的作业
- Promise作业执行使用参数
1
调用getGuestUserID
;id是1〃;在控制台上
如果对挂起的承诺调用then
,则步骤4中描述的将作业放入承诺作业队列的部分在调用then
时不会发生,并且会延迟到承诺实际实现或拒绝(因此不再挂起(时(以及如果(。