Javascript JS:Promise解析器不是一个函数
我试图运行这个jestJS单元测试,但我确实得到了Javascript JS:Promise解析器不是一个函数,javascript,reactjs,jestjs,Javascript,Reactjs,Jestjs,我试图运行这个jestJS单元测试,但我确实得到了TypeError:Promise resolver undefined不是一个函数。我做错了什么 it('_onSubmit() should throw error if data is missing', (done) => { const createUserMutation = () => new Promise() const wrapper = shallow(<CreateAccount createUs
TypeError:Promise resolver undefined不是一个函数。我做错了什么
it('_onSubmit() should throw error if data is missing', (done) => {
const createUserMutation = () => new Promise()
const wrapper = shallow(<CreateAccount createUserMutation={createUserMutation} />)
wrapper.update().find(Form).simulate('submit', {
preventDefault: () => {}
})
createUserMutation.resolve().then(() => {
expect(console.error).toHaveBeenCalled()
done()
})
})
it(''u onSubmit()如果数据丢失,则应抛出错误',(完成)=>{
const createUserMutation=()=>newpromise()
常量包装器=浅()
wrapper.update().find(Form).simulate('submit'{
preventDefault:()=>{}
})
createUserMutation.resolve()。然后(()=>{
expect(console.error).toHaveBeenCalled()
完成()
})
})
新承诺()
正在尝试创建一个没有执行器函数*的承诺。正确的用法是传入一个函数,该函数最多可接受两个参数(resolve
和reject
),例如:
有关MDN的更多信息:
稍后,您似乎试图在promise实例上调用resolve
。你也不能这样做(除非你没有使用标准承诺)。使用传递给执行器的resolve
函数解析承诺。(我试图为您修改代码,但需要太多上下文信息。)
*我很惊讶地看到V8的错误消息说“resolver function”,但我已经验证了它的正确性。将其称为执行器,我本以为“解析器函数”将是Promise
构造函数作为第一个参数传递给它的函数…如果您只想创建一个已解析的Promise,那么使用Promise.resolve()
,它将返回一个新的、已解析的Promise
newpromise()
用于将非承诺(通常是异步的)代码转换为承诺,但在这里似乎不需要。如果要使用它,就必须向其中传递一个函数(正如Felix Kling和TJ Crowder已经指出的)
还有几点:
- 您正在将
createUserMutation
定义为一个函数,因此几行之后使用它时,您需要使用()
调用它。或者你可以选择让它不是一个函数,因为你在这里所要做的就是产生一个承诺
- 此外,正如Felix Kling所指出的,承诺没有
resolve()
方法。您只需调用promise.resolve()
生成的承诺即可
承诺构造函数需要一个函数。promise实例没有resolve
方法。我一直在努力弄清楚这个测试应该如何工作。你能告诉我们产生这段代码的思想过程吗?你想用承诺做什么?你为什么在这里用承诺?代码的哪一部分是异步的?但我不明白如何将resolve().then()
转化为承诺…@user3142695:恐怕我不能理解你的代码。通常,所有操作都发生在承诺执行器内部,但在您的情况下,它包含在一个箭头函数中;如果不了解您的项目,我恐怕无法真正解释如何更新代码。请参阅链接文章(我添加了第二篇),了解有关如何使用承诺的更多信息。不过。FWIW,作为你的第一个要点,我怀疑这是正确的:她/他正在传递函数,而不是它的结果,作为一个道具(可能是为了在改变用户时调用它)。(但显然,我们需要更多的上下文来确定这两种情况。)
var p = new Promise((resolve, reject) => {
// ...code that does something, ultimately calls either resolve or reject
});