Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Promise.map不';不返回值_Javascript_Node.js_Promise_Bluebird - Fatal编程技术网

Javascript Promise.map不';不返回值

Javascript Promise.map不';不返回值,javascript,node.js,promise,bluebird,Javascript,Node.js,Promise,Bluebird,我是新来的 这是我的密码 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.fi

我是新来的

这是我的密码

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)

为我打印
[未定义,未定义,未定义,未定义,未定义]
。 (我的数组有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”
]

我就是这样做的

使用内置承诺代替蓝鸟和许多小功能:

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))
}
函数compileChatnameArray(公司id,参数){
findOrCreateUsers(公司id,参数)。然后((用户对象)=>{
调试(userObjIdArr)
//给你
})
}
/**
*@return{Promise}
*/
函数findOrCreateUsers(公司id,参数){
const tasks=paramArr.map((paramObj)=>findOrCreateUser(公司id,paramObj))
return Promise.all(tasks)//所有任务完成后返回
}
/**
*@param{String}公司id
*@param{{customer_id:string,firstname:string,lastname:string}}paramObj
*@return{Promise}
*/
函数findOrCreateUser(_company_id,paramObj){
const chat_name=paramObj.customer_id;
const full_name=paramObj.firstname+paramObj.lastname;
返回Model.findOne({chat_name})。然后((user)=>{
如果(用户){
返回承诺。解析(用户。\u id)
}
返回createUser({{公司id聊天室名称,全名})
})
}
/**
*@param{{{{u company\u id:string,chat{u name:string,full{u name:string}}userData
*@return{Promise}
*/
函数createUser(userData){
返回Model.add(userData).then((user)=>Promise.resolve(user.\u id))
}

您的映射函数不会返回任何->
未定义的
返回模型。findOne({…})。lean()…
是否应该是
返回模型。findOne…
映射
函数中?@Andreas---我在这里返回:-return userObjIdArr@Manu如果我返回
Model.findOne
,那么我将如何将
用户添加到
用户objarray
,我是否必须为此写下另一个承诺,并且我有一个检查,如果用户不在场,我将添加它并将id推送到
用户objarray
。通常通过使用
async
我在回调中获得
userObjArray
。。。在promise.map的情况下,如何做非常困惑