Я пишу модуль, который использует API Google, но я обертываю все, что является обратным вызовом, основанным на обещании. Это код проблемной областиОбещание не работает внутри обратного вызова
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')
запускает, но затем console.log('1')
в catch
не запускается, ошибка не выбрасывается, и программа разбилась на resolve(res)
, потому что res
не определен. Я пытался поставить ловец ошибки в качестве второго аргумента then
вместо использования catch
, но до сих пор не работает
api.search('example').then(res => {
...do some stuff...
}, err => {
console.log('2') // Still doesn't run
throw err
})
Я бегу Узел v6.2.1
Вы не должны 'return' обещание ? Также не должно быть 'else'? Похоже, что 'resolve' всегда будет вызываться независимо ... – elclanrs
Я не возвращаю обещание? Я никогда не видел, чтобы кто-то делал что-то вроде > return resolve() или > return reject() А что касается остальных, возможно, вы правы. Я следую общей схеме обработки обратных вызовов, которые возвращают что-то, но да, это может не работать для обещаний. У меня всегда было это в моей голове, хотя это «разрешить» и «отвергнуть» вид действия, как возвращение, но это может быть просто дырой в моих знаниях обещаний. – Weston
Проверьте мой ответ, надеюсь, что это поможет. Кроме того, неважно, что такое 'else'. – elclanrs