return true 实际上 returns undefined using async
return true actually returns undefined using async
如果该值不存在,我正在尝试做一些事情,以便我可以更新它。但 isExist 函数始终 return 未定义。我能用这个做什么?
参考: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;
}
}
如果 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;
}
}
让我们看看您的 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
块将 运行 – 这个 returns false
。当条件为 true
时,第一个块将 运行 但是 没有 return 语句,因此隐式地 returning undefined
.
你说"why does it not have a return statement?",我很确定我有.
看起来你这里有一个。
if (docs.length) {
return true;
} else {
return false;
}
但是看看它 return 从哪个函数中退出。它只是 return 传给 Ero.find
的回调函数,它不会 return 传给 isExist
.
你问"what can I do about this?".
我假设 Ero.find
是一个异步函数,因此 isExist
也会变成一个异步函数。要在 JavaScript 中执行异步功能,您可以使用 Promises or async 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);
}
});
}
进一步阅读
- Async & Performance, a book in the series You Don't Know JS 作者:凯尔·辛普森。
- Promises in JavaScript
- Async functions in JavaScript
如果该值不存在,我正在尝试做一些事情,以便我可以更新它。但 isExist 函数始终 return 未定义。我能用这个做什么?
参考: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;
}
}
如果 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;
}
}
让我们看看您的 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
块将 运行 – 这个 returns false
。当条件为 true
时,第一个块将 运行 但是 没有 return 语句,因此隐式地 returning undefined
.
你说"why does it not have a return statement?",我很确定我有.
看起来你这里有一个。
if (docs.length) {
return true;
} else {
return false;
}
但是看看它 return 从哪个函数中退出。它只是 return 传给 Ero.find
的回调函数,它不会 return 传给 isExist
.
你问"what can I do about this?".
我假设 Ero.find
是一个异步函数,因此 isExist
也会变成一个异步函数。要在 JavaScript 中执行异步功能,您可以使用 Promises or async 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);
}
});
}
进一步阅读
- Async & Performance, a book in the series You Don't Know JS 作者:凯尔·辛普森。
- Promises in JavaScript
- Async functions in JavaScript