Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/462.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 承诺拒绝在回调内部不工作_Javascript_Node.js_Error Handling_Callback_Promise - Fatal编程技术网

Javascript 承诺拒绝在回调内部不工作

Javascript 承诺拒绝在回调内部不工作,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'

我正在编写一个使用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') //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
inside
search
,那么您可以取消这些承诺:

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