【发布时间】:2016-10-14 18:42:05
【问题描述】:
我正在编写一个使用 Google API 的模块,但是我将所有基于回调的东西都包装在一个 Promise 中。这是问题区域的代码
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') //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 未定义。我尝试将错误捕获器作为then 的第二个参数,而不是使用catch,但这仍然不起作用
api.search('example').then(res => {
...do some stuff...
}, err => {
console.log('2') // Still doesn't run
throw err
})
我正在运行 Node v6.2.1
【问题讨论】:
-
你不应该
return承诺吗?也不应该有else吗?看起来resolve无论如何都会被调用... -
我没有兑现承诺吗?我从来没有见过有人这样做 > return resolve() 或 >return reject() 至于其他,你可能是对的。我正在遵循处理返回某些内容的回调的常见模式,但是是的,这可能不适用于 Promise。尽管“解决”和“拒绝”有点像回归,但我一直在脑海中浮现,但这可能只是我对承诺的认识中的一个漏洞。
-
检查我的答案,希望对您有所帮助。另外,不要介意
else部分。
标签: javascript node.js error-handling callback promise