我知道您可以在.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
。所以我不确定我做错了什么。
答案 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。周期。