我是node.js的新手。我想了解Q.nfcall。 我有以下Node.js代码。
function mytest() {
console.log('In mytest');
return 'aaa';
}
Q.nfcall(mytest)
.then(
function(value){
console.log(value);
});
我的预期输出应为:
In mytest
aaa
但实际输出是:
In mytest
在上面的代码中我将Q.nfcall更改为Q.fcall后,输出变为我的预期:
In mytest
aaa
为什么? Q.nfcall和Q.fcall有什么区别?感谢。
答案 0 :(得分:13)
来自Q文档:
如果您正在使用使用Node.js回调的函数 模式,其中回调是函数形式(错误,结果),Q 提供一些有用的实用程序函数,用于在它们之间进 最直接的可能是Q.nfcall和Q.nfapply
这意味着nfcall()
期望节点式function(cb)
调用cb(error, result)
。
所以当你写:
Q.nfcall(mytest)
.then(
function(value){
console.log(value);
});
Q
期望mytest
次调用通过(error, value)
和Q
回调,然后使用next
调用value
回调。
所以你的代码看起来应该是这样的(这里是Plunkr):
function mytest(cb) {
console.log('In mytest');
cb(null, 'aaa');
}
Q.nfcall(mytest)
.then(
function(value){
console.log('value', value);
});
您可以查看nfcall() test cases以更深入地了解它应该如何使用。
答案 1 :(得分:2)
接受的答案很好,但要解决差异:
例如:
<?php
$strHeading = "<h1>Hello " . $_POST["username"] . "</h1>";
switch ($_POST["favoritecolor"]) {
case "r":
$strBackgroundColor = "rgb(255,0,0)";
break;
case "g";
$strBackgroundColor = "rgb(0,255,0)";
break;
case "b":
$strBackgroundColor = "rgb(0,0,255)";
break;
default:
$strBackgroundColor = "rgb(255,255,255)";
break;
}
?>
<html>
<head>
<title>Form</title>
</head>
<body style="background: <?php echo $strBackgroundColor; ?>;">
<? echo $strHeading; ?>
</body>
</html>
请参阅https://github.com/kriskowal/q/wiki/API-Reference#qnfapplynodefunc-args
答案 2 :(得分:1)
虽然接受的答案很好地解释了nfcall,但这与fcall和nfcall没什么区别。
两个方法都返回一个诺言。
fcall返回一个promise,该promise将被解析为其所接收函数的返回值。
nfcall返回一个承诺,该承诺将被解析(或拒绝)为输入函数在调用时应接收的回调结果的值。
例如
return Q.nfcall(FS.readFile, "foo.txt", "utf-8");
可以翻译成以下代码
return new Promise((resolve, reject)=>{
FS.readFile("foo.txt","utf-8",function(err, result){
if (err)
{
reject(err);
return err;
}
resolve(result);
});
});
哪里
return Q.fcall(function () {
return 10;
});
可以翻译为
return new Promise((resolve,reject)=>{resolve(10);});