2017-02-10 109 views
0

我是新來的無極Promise.map沒有返回值

這裏是我的代碼

compileChatnameArray(company_id, paramArr) { 
    const Model = this; 
    let userObjIdArr = []; 

    return Promise.map(paramArr, function (paramObj) { 
     const chat_name = paramObj.customer_id; 
     const full_name = paramObj.firstname + paramObj.lastname; 

     let queryObj = Model.findOne({ 
       chat_name: chat_name 
      }) 
      .lean() 
      .select('_id') 
      .exec() 
      .then((user) = > { 
       if (user) { 
        userObjIdArr.push(user._id); 
        return userObjIdArr; 
       } else { 
        var bodyParam = { 
         _company_id: company_id, 
         chat_name: chat_name, 
         full_name: full_name 
        }; 
        Model.add(bodyParam) 
         .then((newUser) = > { 
          userObjIdArr.push(newUser._id); 
          return userObjIdArr; 
         }) 
       } 
      }); 
    }) 
    .then((userObjIdArr) = > { 
     debug(userObjIdArr); 
     return Promise.resolve(userObjIdArr); 
    }) 
} 

問題是debug(userObjIdArr);

打印[ undefined, undefined, undefined, undefined, undefined ]我。 (我的數組有5個對象)

//已編輯部分 我在map函數裏添加了Promise resolve部分,它給了我有線的結果。我可以理解我只是在一個簡短的邏輯後面,但無法弄清楚在哪裏。

compileChatnameArray(company_id, paramArr) { 

    const Model = this; 
    let userObjIdArr = []; 

    return Promise.map(paramArr, function(paramObj) { 

     const chat_name = paramObj.customer_id; 
     const full_name = paramObj.firstname + paramObj.lastname; 

     let queryObj = Model.findOne({ chat_name: chat_name}) 
          .lean() 
          .select('_id') 
          .exec(); 


     return new Promise(function(resolve, reject) { 
      // code starts here 
      queryObj.then((user) => { 

       if(user) { 
        userObjIdArr.push(user._id) 
        resolve(userObjIdArr); 
       } else { 
        //add user here 
        var bodyParam = { 
         _company_id : company_id, 
         chat_name : chat_name, 
         full_name : full_name 
        }; 
        Model.add(bodyParam) 
         .then((newUser) => { 
          userObjIdArr.push(newUser._id) 
          resolve(userObjIdArr); 
         }) 
         .catch((err) => { 
          reject(err); 
         }); 

       } 
      }); 
      queryObj.catch((err) => { 
       reject(err); 
      }) 
     }) 
    }); 

} 

,現在我得到以下結果

[ [ "589d598f07e32926b4ae9d6b", "589d598f07e32926b4ae9d6c", "589d598f07e32926b4ae9d6e", "589d598f07e32926b4ae9d6f", "589d598f07e32926b4ae9d6d" ], [ "589d598f07e32926b4ae9d6b", "589d598f07e32926b4ae9d6c", "589d598f07e32926b4ae9d6e", "589d598f07e32926b4ae9d6f", "589d598f07e32926b4ae9d6d" ], [ "589d598f07e32926b4ae9d6b", "589d598f07e32926b4ae9d6c", "589d598f07e32926b4ae9d6e", "589d598f07e32926b4ae9d6f", "589d598f07e32926b4ae9d6d" ], [ "589d598f07e32926b4ae9d6b", "589d598f07e32926b4ae9d6c", "589d598f07e32926b4ae9d6e", "589d598f07e32926b4ae9d6f", "589d598f07e32926b4ae9d6d" ], [ "589d598f07e32926b4ae9d6b", "589d598f07e32926b4ae9d6c", "589d598f07e32926b4ae9d6e", "589d598f07e32926b4ae9d6f", "589d598f07e32926b4ae9d6d" ] ]

,而我只需要

[ "589d598f07e32926b4ae9d6b", "589d598f07e32926b4ae9d6c", "589d598f07e32926b4ae9d6e", "589d598f07e32926b4ae9d6f", "589d598f07e32926b4ae9d6d" ]

+0

你映射功能不返回任何東西 - >'undefined' – Andreas

+1

'返回Model.findOne({...} ).lean().....' – Manu

+0

它不應該在'map'函數中返回'Model.findOne ...'嗎? – piotrbienias

回答

0

這是我會怎麼做;

使用內置的承諾,而不是青鳥和很多微小的功能:

function compileChatnameArray(company_id, paramArr) { 
    findOrCreateUsers(company_id, paramArr).then((userObjIdArr) => { 
    debug(userObjIdArr) 
    // here you are 
    }) 
} 

/** 
* @return {Promise<Array<string>>} 
*/ 
function findOrCreateUsers(company_id, paramArr) { 
    const tasks = paramArr.map((paramObj) => findOrCreateUser(company_id, paramObj)) 
    return Promise.all(tasks) // return when ALL tasks are completed 
} 

/** 
* @param {String} _company_id 
* @param {{customer_id:string, firstname:string, lastname:string}} paramObj 
* @return {Promise<String>} 
*/ 
function findOrCreateUser(_company_id, paramObj) { 
    const chat_name = paramObj.customer_id; 
    const full_name = paramObj.firstname + paramObj.lastname; 
    return Model.findOne({ chat_name }).then((user) => { 
    if (user) { 
     return Promise.resolve(user._id) 
    } 
    return createUser({ _company_id chat_name, full_name }) 
    }) 
} 

/** 
* @param {{_company_id:string, chat_name:string, full_name:string}} userData 
* @return {Promise<String>} 
*/ 
function createUser(userData) { 
    return Model.add(userData).then((user) => Promise.resolve(user._id)) 
} 
+0

我真的很喜歡這個代碼。 – mithundas79

+1

我將它標記爲正確的答案......但我認爲我需要更多的信譽來投票它....反正謝謝你的幫助 – mithundas79