Q.nfcall和Q.fcall有什么区别?

时间:2014-08-19 17:35:35

标签: javascript node.js q

我是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有什么区别?感谢。

3 个答案:

答案 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)

接受的答案很好,但要解决差异:

  • nfapply 需要数组参数
  • nfcall 期望提供单独
  • 的参数

例如:

<?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);});