请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

正在回答 回答被采纳积分+3

2回答

小学生6年级 2020-03-07 00:20:32

主要这里我也有点好奇源码怎么实现的就看了一下。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 。

0 回复 有任何疑惑可以回复我~
Dell 2019-07-30 00:31:37

resolve 触发后 then中的回掉函数执行

0 回复 有任何疑惑可以回复我~
  • 幕木_ #1
    他问的应该是resolves和then的区别
    这里resolves是expect(fetchData())执行后返回的对象,粗略的看了下源码,except()方法初始化的时候会对参数进行一系列的判断,其中有个 isPromise 判断参数中是不是有.then的方法,如果有那会等fetchData()执行完后再去执行exceprt()中resolves的toMatchObject方法,至于为什么只要在toMatchObject传入自己期望的值{data:{success:true}}就能返回结果,那是因为,fetchData()执行完后,返回值已经被jest拿到了,toMatchObject()中有received和excepted,两个比较下就可以返回判断的值了
      .then方法是异步执行当.then()前的方法执行完后再执行then()内部的程序这样就避免了,数据没获取到等的问题,
    expect(fetchData()).resolves.tomacthObject可以说是简化操作,
    回复 有任何疑惑可以回复我~ 2019-07-30 01:27:51
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信