我有以下代码
var getUrl = function(callback) {
ref.once('value')
.then(function(snap) {
let article_url = snap.val();
console.log(article_url);
callback(null, article_url); // I dont want to throw an error, so I pass null for the error argument
});
};
var getImage = function(err, data, callback) {
//if (err) throw err; // Check for the error and throw if it exists.
textapi.extract({
url: data,
best_image: true
}, function(error, response) {
if (error === null) {
//console.log(response.image);
if (response.image == null || response.image == "") {
image = "https://www.wefornews.com/wp-content/uploads/2017/01/news-3.jpg"
} else {
image = response.image;
}
}
});
callback(null, image); // Otherwise proceed as usual.
};
var updateDatabase = function(err, data) {
//if (err) throw err; // Check for the error and throw if it exists.
refupdate.update ({
"Article_Image_URL": data
});
console.log('success'); // Otherwise proceed as usual
};
getUrl(getImage);
getImage(updateDatabase);
但我在第callback is not a function
行
callback(null, image);
问题是,如果我删除updateDatabase
函数,那么我没有错误。但是当它在代码中时,我得到上面提到的错误。
有人可以告诉我可能导致此错误的原因是什么?
答案 0 :(得分:0)
const updateDatabase = async (value) => {
try {
let snap = await ref.once(value);
let article_url = snap.val();
let image = await textapi.extract({
url: article_url,
best_image: true
});
if (image==='') {image = 'https://www.wefornews.com/wp-content/uploads/2017/01/news-3.jpg'}
refupdate.update({
"Article_Image_URL": article_url
});
} catch (err) {
throw err;
}
}
答案 1 :(得分:0)
因为您未在此次通话getImage(updateDatabase);
(最后一行)上提供任何回调?
答案 2 :(得分:0)
当您致电getUrl(getImage)
时,getImage
功能会作为callback
参数传递给getUrl
。 getUrl
然后调用此callback
参数,传递两个参数。
callback(null, article_url)
但getImage
需要三个参数
var getImage = function(err, data, callback)
所以callback
函数中的getImage
未定义,并且当您尝试将undefined作为函数调用时
callback(null, image)
...您收到了callback is not a function
错误。
<强>解决方案强>
您需要嵌套回调,以便使用正确的参数以正确的顺序调用函数。
getUrl(function (err, article_url) {
getImage(err, article_url, function (err, image) {
updateDatabase(err, image);
});
});
这也可以简化,因为您想在updateDatabase
完成后直接致电getImage
。
getUrl(function (err, article_url) {
getImage(err, article_url, updateDatabase);
});
此外,在你的getImage函数中,callback
函数在textapi.extract
函数完成之前被调用,这可能不是你想要的。
之前
var getImage = function(err, data, callback) {
textapi.extract({
url: data,
best_image: true
}, function(error, response) {
/* code */
});
callback(null, image); // This will get called immediately, without waiting for textapi.extract
};
后
var getImage = function(err, data, callback) {
textapi.extract({
url: data,
best_image: true
}, function(error, response) {
/* code */
callback(null, image); // Callback moved here, so it gets called after textapi.extract completes
});
};