簡體   English   中英

.then()中的Promise.reject返回未定義

[英]Promise.reject in .then() returning undefined

我目前有一個帶有構造函數和兩個方法的ES6類。 對於為什么在Promise.reject(ex)使用Promise.reject(ex)解決未定義的問題.then()我有點困惑。 如果有人不介意解釋我在做什么錯,那將不勝感激。

我有一個名為getYaml()的方法,其中包含以下內容:

_getYaml(recordId) {
  return new Promise((resolve, reject) => {
    fs.readFile(this.workingDir + '/' + recordId + '.yaml', 'utf8', function(err, data) {
      if (err) reject(err)
      resolve(data)
    })
  })
}

然后,我有了另一個名為getCompDoc的方法,該方法利用了另一個方法,如下所示:

getCompDoc(recordId) {
  return this._getYaml(recordId).then(data => {

    let yaml = data

    let yamlObj
    try {
      yamlObj = YAML.safeLoad(yaml)
    } catch (ex) {
      ex.message = `Failure to parse yaml. Error: ${ex.message}`
      logger.error(ex.message, {}, ex)
      return Promise.reject(ex)
    }

    let compDoc = {
      // ...
    }

    return compDoc

  }).catch(err => {
    logger.error(err, {}, err)
  })
}

然后,我進行測試以檢查是否捕獲了YAML解析錯誤,然后拒絕了一個Promise,如下所示:

describe('error cases', () => {
  const fakeRecordId = 'SomeYaml'
  beforeEach(() => {
    sinon.stub(myClass, '_getYaml').returns(Promise.resolve('{{&^%}egrinv&alidgj%^%^&$£@£@£}'))
  })

  afterEach(() => {
    myClass._getYaml.restore()
  })

  it('Error parsing yaml, rejects with error', () => {
    return expect(myClass.getCompDoc(fakeRecordId)).to.be.rejected.then(response => {
      expect(response.message).to.match(/Failure to parse yaml. Error: /)
    })
  })
})

測試輸出:

AssertionError: expected promise to be rejected but it was fulfilled with undefined

如果我只是返回在getCompDoc方法中引發的異常,則可以按預期接收錯誤,但是,一旦我使用Promise.reject它就會以未定義的方式解決。

我當時正在考慮將getCompDoc包裝在return new Promise()但是我不確定這是否是Promise構造函數反模式的示例。 理想情況下,我想拒絕此方法,而不是直接返回錯誤,因為這樣我可以斷言該方法已被拒絕並且未實現。

getCompDoccatch子句中getCompDoc中的錯誤。 具體來說,以下是代表您的代碼的簡化代碼段:

 let getYamlPromise = Promise.reject('REJECTED!'); let getCompDocPromise = getYamlPromise .then(data => console.log('getYamlPromise', data)) .catch(error => console.error('getYamlPromise', error)); getCompDocPromise .then(a => console.log('getCompDocPromise RESOLVED', a)) .catch(a => console.log('getCompDocPromise REJECTED', a)); 

如您所見, getCompDocPromise是使用未定義的解析的。 如果您想傳播錯誤,您的catch子句將必須拋出新錯誤或返回被拒絕的Promise:

 let getYamlPromise = Promise.reject('REJECTED!'); let getCompDocPromise = getYamlPromise .then(data => console.log('getYamlPromise', data)) .catch(error => { console.error('getYamlPromise', error); return Promise.reject(error); }); getCompDocPromise .then(a => console.log('getCompDocPromise RESOLVED', a)) .catch(a => console.log('getCompDocPromise REJECTED', a)); 

暫無
暫無

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

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