简体   繁体   English

Promise.map不返回值

[英]Promise.map doesn't return a value

I am new to Promise 我是Promise的新手

here is my code 这是我的代码

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);
    })
}

The problem is debug(userObjIdArr); 问题是debug(userObjIdArr);

prints [ undefined, undefined, undefined, undefined, undefined ] for me. 为我打印[ undefined, undefined, undefined, undefined, undefined ] (My array has 5 objects) (我的数组有5个对象)

//Edited part I have added the Promise resolve part inside the map function which gives me wired results. //编辑的部分我已经在map函数中添加了Promise resolve部分,这给了我有线的结果。 I can understand I am just behind a short logic but could not figure out where. 我可以理解,我只是一个简短的逻辑背后的人,却不知道在哪里。

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);
          })
      })
  });

}

and now I am getting the following as a result 现在我得到以下结果

[ [ "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" ] ]

whereas I need only 而我只需要

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

This is how I would do this; 这就是我要做的;

Using built-in promises instead of bluebird and a lot of tiny functions: 使用内置的Promise代替bluebird和许多微小的功能:

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))
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM