2017-07-04 103 views
0

我有一個承諾函數承諾或拒絕履行混亂

create(data) { 
     return new Promise((resolve, reject) => { 
      const datetime = Date.parse(new Date()); 
      data.createdAt = datetime; 
      data.updatedAt = datetime; 
      this._db.collection(this._table).insertOne(data, (err) => { 
       if (err) { 
        this._logger.error(err); 
        reject(err); 
       } else { 
        resolve(data); 
       } 
      }); 
     }); 
    } 

,併爲其

it('should reject insertion',() => { 
    const promise = Agent.create(data).then(() => (Agent.create(data))); 
    return expect(promise).to.be.rejected; 
}); 

這種說法通過編寫單元測試。但是,如果單元測試是:

it('should reject insertion',() => { 
    const promise = Agent.create(data).then(Agent.create(data)); 
    return expect(promise).to.be.rejected; 
}); 

它失敗。錯誤是AssertionError: expected promise to be rejected but it was fulfilled with { Object (_id, role, ...) }

這兩種做法的區別在哪裏?我沒有得到它。

+2

你問'()=> Agent.create(data)'和'Agent.create(data)'之間的區別是什麼? – Ryan

+0

區別在於將函數傳遞給'.then'(這是所期望的),並將函數的結果(本例中爲Promise)傳遞給'.then' ...,然後忽略任何傳遞給它的非函數參數以及由'.then'返回的結果諾言都會承擔前面諾言的價值 - 當然這是一個已解決的問題,而不是被拒絕的承諾 –

+0

@JaromandaX當我認爲,他們會屈服如果我將第二個更改爲 'Agent.create(data).then(Agent.create(data).catch ...)' 或 'Agent.create(data).then(Agent .create(data))。catch' – necroface

回答

1

正如許多評論中指出的那樣,您在第一種情況下傳遞函數,在另一種情況下傳遞函數的返回值,這是一個承諾。這就是你看到結果差異的原因。

+0

正如我認爲的,如果我將第二個更改爲 'Agent.create(data).then(Agent.create(data).catch ...)' ,他們會得到相同的結果或者 'Agent.create(data).then(Agent.create(data))。catch' – necroface

+1

不是鏈接promise的最佳方式。看這裏:https://html5hive.org/how-to-chain-javascript-promises/ – tbking