2017-02-12 4 views
1

Я пытаюсь что-то сделать, если значение не существует, поэтому я могу его обновить. но функция isExist всегда возвращает undefined. что я могу сделать с этим?return 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, первый блок будет работать, но нет возврата, поэтому неявно возвращается.

Вы говорите: «Почему у него нет заявления о возврате?», Я уверен, у меня есть.

Это выглядит как у вас есть один здесь.

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

Однако посмотрите, какая функция возвращается. Он только возвращается из функции обратного вызова, переданной в Ero.find, она не возвращается из isExist.

Вы спрашиваете «Что я могу сделать по этому поводу?».

Я предполагаю, что Ero.find является асинхронной функцией, поэтому isExist также станет асинхронной функцией. Для выполнения асинхронных функций в JavaScript вы можете использовать Promises или async functions.

Вот пример кода, который может выглядеть как 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); 
    } 
    }); 
} 

Дальнейшее чтение

0

Использование JSON.parse поставит вас в опасности иметь исключение, если JSON имеет синтаксическую ошибку. Используйте блок 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

Тогда оставьте свои данные. –

Смежные вопросы