return true实际上使用async返回undefined

时间:2017-02-12 11:31:01

标签: javascript node.js asynchronous node-async

如果值不存在,我正在尝试做某事,所以我可以更新它。但是isExist函数总是返回undefined。我该怎么办?

参考: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;
  }
}

2 个答案:

答案 0 :(得分:0)

如果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;
  }
}

答案 1 :(得分:0)

让我们看一下你的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块将运行 - 这将返回false。当条件为true时,第一个块将运行但没有return语句,因此隐式返回undefined

你说“为什么它没有退货声明?”我很确定我有一个

看起来像你有一个。

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

然而,看看它返回的功能。它只返回传递给Ero.find的回调函数,它不会返回isExist

你问“我该怎么办?”

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

以下是使用Promise可能看起来像isExist的示例代码。

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

进一步阅读