主要这里我也有点好奇源码怎么实现的就看了一下。then 相关的我就不罗嗦了就正常逻辑。关键在于 resolve的。
在源码中的 expect 函数中会构造这些 matcher,其中有一段如下:
expectation.resolves.not[name] = makeResolveMatcher(
name,
promiseMatcher,
true,
actual,
err,
);
记住这里 actual 就是我们传入的那个参数,然后接着看 makeResolveMatcher 函数中的返回值为
return actual.then(
result =>
makeThrowingMatcher(matcher, isNot, 'resolves', result, innerErr).apply(
null,
args,
),
reason => {
outerErr.message =
matcherUtils.matcherHint(matcherName, undefined, '', options) +
'\n\n' +
`Received promise rejected instead of resolved\n` +
`Rejected to value: ${matcherUtils.printReceived(reason)}`;
return Promise.reject(outerErr);
},
);
不用看其他,你就看到 actual.then 就知道了实际上此处等于阻塞住了,也就是 expect 之后的链式操作会在 .then 之后执行。 .then 中的 result 就代表我们拿到的 fetchData 。