2017-04-25 42 views
0

是他們在promise中轉換的其他方式嗎?bluebired promisify函數沒有轉換爲承諾

var Promise = require("bluebird"); 
let findOneOrCreate = require('mongoose-find-one-or-create'); 
findOneOrCreate = Promise.promisify(findOneOrCreate); // not converted to promise 

我用像當年在。那麼(): -

 db.employee.findOneOrCreate({ 
       organization: model.organization.id, 
       EmpDb_Emp_id: model.EmpDb_Emp_id 
      }, model) 
      .then((employee, created) => { 
       if (!created) { 
        throw 'employee already exist'; 
       } 
       return employee; 
      }).catch(err => { 
       throw err; 
      }); 

它給出了一個錯誤: -

無法讀取的不確定

+1

'它給出一個錯誤' - 什麼?你發佈的代碼? (不太可能,你不使用'.then') - 你確定你知道你在做什麼嗎? –

+1

'promisify'不返回承諾 - 它返回一個*函數*,當被調用時返回一個承諾。你在哪裏打電話? – Bergi

+0

'mongoose-find-one-or-create'模塊存在缺陷(比賽條件),您應該考慮使用內置的['findOneAndUpdate'](http://mongoosejs.com/docs/api.html#query_Query -findOneAndUpdate)與'upsert:true'相結合。這也意味着你不必提出任何提議,因爲Mongoose支持[開箱即用]承諾(http://mongoosejs.com/docs/promises.html)。 – robertklep

回答

2

首先屬性 '然後' ,根據bluebird documentation,

the node function should conform to node.js convention of accepting a callback as last argument

mongoose-find-one-or-create僅接受schema作爲參數,並將此架構擴展爲findOneOrCreate函數。所以看起來require('mongoose-find-one-or-create')不能被promisified。您可以嘗試擴展架構的promisifying findOneOrCreate代替:

var findOneOrCreate = require('mongoose-find-one-or-create'); 
var PersonSchema = mongoose.Schema({...}); 
PersonSchema.plugin(findOneOrCreate); 
var Person = mongoose.model('Person', PersonSchema); 
var findOneOrCreatePromise = Promise.promisify(Person.findOneOrCreate); 

而且記住,Promise.promisify()返回一個函數,所以你需要調用then之前調用它:

findOneOrCreatePromise().then(...) 

不僅僅是

findOneOrCreatePromise.then(...) 
+0

它被轉換爲承諾,但它不能正常工作..我嘗試回調功能它正在工作審計那裏 – hardy