2017-02-12 1 views
1

값이 존재하지 않으면 무언가를하려고하므로 업데이트 할 수 있습니다. 그러나 isExist 함수는 항상 undefined를 반환합니다. 이걸 내가 뭘 할 수 있니?return true는 실제로 async를 사용하여 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; 
    } 
} 
+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을 반환합니다.

"왜 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

그런 다음 데이터를 게시하지 않습니다 –

관련 문제