2017-02-10 83 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