簡體   English   中英

承諾拒絕在回調內部不起作用

[英]Promise reject not working inside of callback

我正在編寫一個使用Google API的模塊,但是在承諾中包裝了所有基於回調的內容。 這是問題區域的代碼

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 我檢查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

您應該退還諾言:

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
})

另外,如果您在search不需要auth ,則可以取消這些承諾:

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
  reject(new Error(err))
}
else {
  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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM