Javascript 承诺拒绝在回调内部不工作
我正在编写一个使用GoogleAPI的模块,但将所有基于回调的东西包装在一个承诺中。这是问题区域的代码 file1.jsJavascript 承诺拒绝在回调内部不工作,javascript,node.js,error-handling,callback,promise,Javascript,Node.js,Error Handling,Callback,Promise,我正在编写一个使用GoogleAPI的模块,但将所有基于回调的东西包装在一个承诺中。这是问题区域的代码 file1.js var File2 = require('file2') var api = new File2() api.auth().then(auth => { api.search('example').then(res => { ...do some stuff... }) }).catch(err => { console.log('1'
var File2 = require('file2')
var api = new File2()
api.auth().then(auth => {
api.search('example').then(res => {
...do some stuff...
})
}).catch(err => {
console.log('1') //Not being run
throw err
})
file2.js
class File2(){
auth() {
...works fine and resolves...
}
search() {
return new Promise((resolve, reject) => {
googleapi.somemethod(options, (err, res) => {
if(err) {
console.log('2') // DOES run
reject(new Error(err))
}
resolve(res.field) //Program crashes here because reject didn't actually reject
})
})
}
调用auth
工作正常,但是调用search
(更具体地说是googleapi.somemethod
)失败,并且定义了err
。我检查错误,然后运行console.log('2')
,但是catch
中的console.log('1')
没有运行,没有抛出错误,程序在resolve(res)
上崩溃,因为res
未定义。我尝试将错误捕获器作为的第二个参数,然后
,而不是使用捕获
,但仍然不起作用
api.search('example').then(res => {
...do some stuff...
}, err => {
console.log('2') // Still doesn't run
throw err
})
我正在运行NodeV6.2.1您应该返回承诺:
var File2 = require('file2')
var api = new File2()
api.auth().then(auth => {
return api.search('example').then(res => { // return the promise
return ...
})
}).catch(err => {
console.log('1') // Not being run
throw err
})
此外,如果您不需要auth
insidesearch
,那么您可以取消这些承诺:
var File2 = require('file2')
var api = new File2()
api.auth().then(auth => {
return api.search('example')
}).then(res => {
return ...
}).catch(err => {
console.log('1') //Not being run
throw err
})
调用reject()不会停止您的程序,下面的所有代码也将被执行
请更新自
if(err) {
console.log('2') // DOES run
reject(new Error(err))
}
resolve(res.field) //Program crashes here because reject didn't actually reject
到
*更新*
或者您可以将代码缩短为
if(err) {
console.log('2') // DOES run
return reject(err) // no need to new Error object
}
resolve(res.field) //Program crashes here because reject didn't actually reject
你不应该把承诺退回吗?是否也应该有一个
其他?看起来无论怎样,resolve
都会被调用……我不是在回报承诺吗?我从未见过有人做过类似于>返回解析()或>返回拒绝()的事情,至于其他人,你可能是对的。我遵循处理返回内容的回调的常见模式,但这可能不适用于承诺。我一直在想,“决心”和“拒绝”有点像回报,但这可能只是我对承诺认识的一个漏洞。检查我的答案,希望能有所帮助。另外,不要担心else
部分。完成您所说的操作后,catch
中的console.log
正在运行,但throw err
不会使程序崩溃。知道为什么会这样吗?throw
不应该让你的程序在承诺内崩溃,这是出于设计。在一个允诺中,抛出err==返回允诺。拒绝(err)
,所以你会在以后的.catch()
中处理错误,就像.catch(err=>抛出err)。catch(handleError)
不会在那一秒中抛出err==返回允诺。拒绝(err)
一样。是的,它们总是等价的,当您抛出时,您必须捕获,这就是承诺的要点,它反映了同步行为。阅读这篇文章,它会澄清你的疑问。我也想过这一点,但事实并非如此,因为承诺只能处于一种状态。如果拒绝,则无法解决。尽管如此,我还是会用else
来写它,因为这会让流程更清晰。或者你可以按照我在@elclanrsYes上面更新的第二个解决方案来写,这是另一个让它更清晰的选项,但问题仍然存在,一旦你拒绝了解决方案,就不会调用它。看见
if(err) {
console.log('2') // DOES run
return reject(err) // no need to new Error object
}
resolve(res.field) //Program crashes here because reject didn't actually reject