在Nodejs中返回Promise结果而不是Promise

时间:2017-01-18 12:07:54

标签: javascript node.js promise

背景

我正在努力学习承诺,并且我有一个我希望改进的承诺链。

问题

在学习如何连接承诺的同时,我不明白为什么有人宁愿回复承诺而不是回报它的价值。

采用以下示例,该示例使用promise chaining:

let myObj = new MyClass();

myObj.getInfo()
    .then(result => writeOutput(FILE_NAME, result))
    .then(console.log(FILE_NAME + " complete"))
    .catch(error => console.error(error));

class MyClass{

    getInfo() {
        return new Promise(function(fulfil, reject) {
            fulfill("I like bananas");
        });
}

在这里,我必须连锁2次。但是,如果我直接从方法getInfo()返回结果而不是返回Promise,我可能会执行以下操作:

let myObj = new MyClass();

let str = myObj.getInfo();

writeOutput(FILE_NAME, str)
    .then(console.log(FILE_NAME + " complete"))
    .catch(error => console.error(error));

问题

所以你可以看到我有点困惑。

  1. 鉴于getInfo()实际上是异步的,是否有可能在我的第二个代码示例中实现类似的代码?
  2. 如果有可能,那会是个好主意吗?你会怎么做?

4 个答案:

答案 0 :(得分:2)

如果在调用该函数时该值立即可用(在事件循环的同一刻度上),则只能从某个函数返回一个值。请记住,$sqlCheck = "SELECT ActivID, DateRequired, TimeRequired FROM activBooking WHERE ActivID = '$_POST[ActivID]' AND DateRequired = '$_POST[DateRequired]' AND TimeRequired = '$_POST[TimeRequired]'"; $query=mysqli_query($sqlCheck,$con); //$con=your connection setting $num=mysqli_num_rows($query); if($num > 0) { echo "Sorry, this time slot is unavailable for this activity"; } else { $sql = "INSERT INTO activBooking (CustomerID, ActivID, DateRequired, TimeRequired) VALUES ('$_POST[CustomerID]','$_POST[ActivID]','$_POST[DateRequired]','$_POST[TimeRequired]')"; if($sql){ echo "Data Entered"; } else{ echo "Problem while entering new data"; } } 是同步的。

如果它不可用,那么你只能返回一个承诺(或者你可以使用回调,但在这里你特别询问承诺)。

有关更详细的解释,请参阅我之前写的一个问题的答案,询问如何从某个函数返回AJAX调用的结果。我解释了为什么你不能返回价值,但你可以回复一个承诺:

这是另一个相关的答案 - 由于某种原因它被推翻但我认为它解释了一个类似的问题,你问她:

答案 1 :(得分:2)

  

我不明白为什么有人宁愿回复承诺而不是回报它的价值。

因为你还没有价值。

  

鉴于getInfo()实际上是异步的,是否可以实现与我的第二个代码示例中的代码类似的代码?

如果它是异步的,它必须返回一个承诺。

async/await可以实现避免then调用(但仍使用并生成承诺)的语法:

async function writeInfo(FILE_NAME) {
    const myObj = new MyClass();
    try {
        const str = await myObj.getInfo();
        await writeOutput(FILE_NAME, str);
        console.log(FILE_NAME + " complete");
    } catch (error) {
        console.error(error);
    }
}
writeInfo("…");

答案 2 :(得分:1)

承诺的目的是说:“数据将在某个时间出现,现在继续编码”,这样您的页面就不会卡住了。基本上你使用Promises来从服务器加载东西。

答案 3 :(得分:1)

另一种看待第一个问题的方式(“为什么会有人......”):

当您在承诺上调用.then.catch时,从调用返回的待处理承诺将附加到现有承诺链的末尾。 (允许“现有链”可能只包含一个承诺)。

当你解决(不是“履行”,你不能履行诺言承诺)承诺的承诺时,解决方案中使用的承诺是插入头部剩下的承诺链。

在调用链中的下一个.then.catch子句之前,解析中使用的承诺必须履行并带有值。