2017-02-10 2 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 объектов)

// Отредактированная часть Я добавил часть решения Promise в функцию карты, которая дает мне проводные результаты. Я могу понять, что я просто за короткой логикой, но не мог понять, где.

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

Разве это не' return Model.findOne ... 'внутри функции' map'? – 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

Смежные вопросы