gpt4 book ai didi

node.js - 在q(promise)中,无法读取未定义的属性 'apply'?

转载 作者:太空宇宙 更新时间:2023-11-03 23:25:36 24 4
gpt4 key购买 nike

我尝试使用nodejs的q库,我使用Q.fcall,然后出现以下错误。

file_path/node_modules/q.js:155
throw e;
^
TypeError: Cannot read property 'apply' of undefined
at Promise.apply (/Users/name/Desktop/Programming/video_tutorial_archive/node_modules/q/q.js:1185:25)
at Promise.promise.promiseDispatch (/Users/name/Desktop/Programming/video_tutorial_archive/node_modules/q/q.js:808:41)
at /Users/name/Desktop/Programming/video_tutorial_archive/node_modules/q/q.js:1411:14
at runSingle (/Users/name/Desktop/Programming/video_tutorial_archive/node_modules/q/q.js:137:13)
at flush (/Users/name/Desktop/Programming/video_tutorial_archive/node_modules/q/q.js:125:13)
at _combinedTickCallback (internal/process/next_tick.js:73:7)
at process._tickCallback (internal/process/next_tick.js:104:9)

以下是我的代码:

app.get('/',function(req,res){

Q.fcall(sql_query.select_comment(con,comment))
.then(function(){

var deferred=Q.defer();
con.query("SELECT * FROM "+table_video, function (err, result) {
console.log("step 2 finished");
console.log("comment is "+comment);
// if (err) throw err;
query_result=result;
// deferred.resolve();

// console.log(query_result);
})
// return deferred.promise;

}).then(function(){
console.log("step 3 finished");
console.log("comment is "+comment);
console.log(query_result);

res.render('index',{
result:query_result,
comment:comment.comment
});
}).done();

});

我可以用 Q.defer 解决它,但我想用 fcall 代替。它更干净,没有所有 deferred.promise 和 deferred.resolve。

什么原因导致错误“无法读取未定义的属性‘应用’”?又该如何解决呢?

最佳答案

首先,您必须将函数传递给 Q.fcall() 。您正在传递来自 sql_query.select_comment(con,comment) 的返回结果这显然不是一个函数。

使用Q.fcall()正确,您将第一个参数作为要调用的函数传递,以下参数是您要传递给该函数的参数。另外,如果你想要select_comment仍受 sql_query 的约束(我不知道是否需要),那么你可以使用.bind()为了安全起见。您可以将它们放在一起,如下所示:

Q.fcall(sql_query.select_comment.bind(sql_query), con, comment)

您收到的错误Cannot read property 'apply' of undefined是因为 sql_query.select_comment() 的返回值是 undefined所以当 Q.fcall()尝试使用.apply()在其上附加参数,它会抛出该错误。

您还有另一个错误,即您的外部 promise 不等待 con.query("SELECT * FROM "+table_video, function (err, result) {})完成。最好的解决方案是仅对所有数据库函数使用 promise 接口(interface)。然后,您只需返回con.query()的 promise 即可。从里面.then()处理程序,它将自动链接到父 Promise,并且事情将正确排序。

亲眼看看 Q.fcall() 内部发生了什么,您可以查看该函数的源代码 here on Github :

Q.fcall = function (object /* ...args*/) {
return Q(object).dispatch("apply", [void 0, array_slice(arguments, 1)]);
};

最终会尝试调​​用 .apply()关于 Q.fcall() 的第一个参数.

关于node.js - 在q(promise)中,无法读取未定义的属性 'apply'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44741754/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com