2017-02-12 92 views
1

我试图做一些事情,如果该值不存在,所以我可以更新它。但isExist函数总是返回undefined。我能用这个做什么?返回true实际返回undefined使用async

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

一个的jsfiddle将是很好 – Mazz

回答

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时,第一个块将运行,但是没有返回语句,因此隐式返回undefined

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

看起来像你有一个在这里。

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

但是看看它返回哪个函数。它只返回回传给Ero.find的回调函数,它不返回isExist

你问“我能做些什么呢?”

我假设Ero.find是一个异步函数,因此isExist也将成为一个异步函数。要在JavaScript中执行异步功能,您可以使用Promisesasync 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); 
    } 
    }); 
} 

进一步阅读

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; 
    } 
} 
+0

它没有得到我的任何错误 – boombamboo

+0

然后上传您的数据。 –