2017-02-12 8 views
1

値が存在しない場合は何かをしようとしています。 isExist関数は常にundefinedを返します。これで何ができますか?return trueは、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

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

この関数では、条件付きで2つの分岐があります。条件がfalseの場合、elseブロックが実行されます。これはfalseを返します。条件がtrueの場合、最初のブロックは実行されますが戻りステートメントがないため、暗黙的にundefinedを返します。

あなたはと言っています。なぜ「return文がありませんか?」私はかなり持っていると確信しています

のように表示されます。

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

ただし、どの機能が返ってきているかを見てください。それはEro.findに渡されたコールバック関数から戻ってくるだけで、isExistを返しません。

「これについて私は何ができますか?」

Ero.findは非同期関数なので、isExistも非同期関数になります。 JavaScriptで非同期関数を使用するには、Promisesまたはasync functionsを使用できます。

ここに、isExistがPromiseでどのように見えるかのコードの例を示します。さらに

  • Async & Performance、カイル・シンプソンシリーズYou Don't Know JSで本を読んで

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

  • Promises in JavaScript
  • Async functions in JavaScript
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

その後、あなたのデータを投稿してください。 –

関連する問題