return true 实际上 returns undefined using async

return true actually returns undefined using async

如果该值不存在,我正在尝试做一些事情,以便我可以更新它。但 isExist 函数始终 return 未定义。我能用这个做什么?

参考:Ero 已经定义。

async.forEachOf(idArray, function(value, key, cb) {
    rp(baseURL + value)
      .then(function(json) {
          if (!isExist(json)) {
              // do something
            } else {
                console.log(isExist(json), "It's not video or exists");
            }
        })
    .catch(function(err) {
      console.error(err);
    })
    cb();
  }, function() {
    res.status(200)
  });
});

function isExist(data) {
  let parsedData = JSON.parse(data);
  if (parsedData.items[0].type === 'Video') {
    Ero.find({
      videoUri: parsedData.items[0].url_mp4
    }, function(err, docs) {
      if (docs.length) {
          return true;
      } else {
          return false;
      }
    })
  } else {
      return false;
  }
}

如果 JSON 有语法错误,使用 JSON.parse 会使您面临出现异常的风险。使用 try / catch 块。

在不知道你的数据的情况下,我不能说你的支票还有什么问题。

function isExists(data){
  try{
    var parsedData = JSON.parse(data);
    if (parsedData.items[0].type === 'Video') {
      Ero.find({
        videoUri: parsedData.items[0].url_mp4
      }, function(err, docs) {
        if (docs.length) {
          return true;
        } else {
          return false;
        }
      })
    } else {
      return false;
    }
  }catch(e) {
    // any error 
    return false;
  }
}

让我们看看您的 isExist 函数。

function isExist(data) {
  let parsedData = JSON.parse(data);
  if (parsedData.items[0].type === 'Video') {
    Ero.find({
      videoUri: parsedData.items[0].url_mp4
    }, function(err, docs) {
      if (docs.length) {
          return true;
      } else {
          return false;
      }
    })
  } else {
      return false;
  }
}

在该函数中,您有两个条件分支。当条件为 false 时,else 块将 运行 – 这个 returns false。当条件为 true 时,第一个块将 运行 但是 没有 return 语句,因此隐式地 returning undefined.

你说"why does it not have a return statement?",我很确定我有.

看起来你这里有一个。

if (docs.length) {
  return true;
} else {
  return false;
}

但是看看它 return 从哪个函数中退出。它只是 return 传给 Ero.find 的回调函数,它不会 return 传给 isExist.

你问"what can I do about this?".

我假设 Ero.find 是一个异步函数,因此 isExist 也会变成一个异步函数。要在 JavaScript 中执行异步功能,您可以使用 Promises or async functions.

下面是 isExist 使用 Promise 的示例代码。

function isExist(data) {
  /**
   * `isExist` returns a Promise. This means the function _promises_ to have a value resolved in the future.
   */
  return new Promise((resolve, reject) => {
    let parsedData = JSON.parse(data);
    if (parsedData.items[0].type === 'Video') {
      Ero.find({
        videoUri: parsedData.items[0].url_mp4
      }, function(err, docs) {
        if (docs.length) {
          /**
           * Once `Ero.find` has completed, `resolve` `isExist` with a value of `true`, otherwise `resolve` `isExist` with a value of `false`.
           */
          resolve(true);
        } else {
          resolve(false);
        }
      })
    } else {
      /**
       * You can resolve a Promise even without performing an asynchronous operation.
       */
      resolve(false);
    }
  });
}

进一步阅读