如何从函数返回Promise的值?

时间:2017-01-30 04:50:08

标签: javascript node.js promise bluebird

我知道您可以在.then方法中访问Promise的值,如下面的代码所示:

const Promise = require("bluebird");
const fs = Promise.promisifyAll(require('fs'));
const mergeValues = require('./helper').mergeValues;


fs.readFileAsync('./index.html', {encoding: "utf8"})
    .then((data) => {
        return mergeValues(values, data); //async function that returns a promise
    })
    .then((data) => {
        console.log(data);
    });

在上面的示例中,我正在读取文件,将数据与某些值合并,然后将数据记录到控制台。

但是如同通常在同步函数中那样从函数返回值如何呢?如果我关注documentation,我认为代码应如下所示:

function getView(template, values) {
    let file = fs.readFileAsync('./' + template, {encoding: "utf8"});
    let modifiedFile = file.then((data) => {
            return mergeValues(values, data);
        });
    return modifiedFile.then((data) => {
        return modifiedFile.value();
    });
}
console.log(getView('index.html', null));

但由于某种原因,它不起作用。我在控制台中获得的只是Promise对象本身,而不是值。当我在.isFulfilled上添加modifiedFile方法时,它会输出到true。所以我不确定我做错了什么。

1 个答案:

答案 0 :(得分:1)

承诺不会那样运作。它们本质上是异步,因此您无法像使用同步代码那样与它们进行交互。

这意味着您必须使用then方法来获取值:

function getView(template, values) {
    let file = fs.readFileAsync('./' + template, {encoding: "utf8"});
    let modifiedFile = file.then((data) => {
            return mergeValues(values, data);
        });
    return modifiedFile.then((data) => {
        return modifiedFile.value();
    });
}
// This won't work
// console.log(getView('index.html', null)); 

// instead:
getView('index.html', null).then(function (view) {
    console.log(view);
});
  

所以我不确定我做错了什么。

实际上,你没有做错任何事情。你不能像函数中的普通返回值那样使用promises。周期。