Node.js 如何解析nodejs承诺中的值

Node.js 如何解析nodejs承诺中的值,node.js,promise,q,Node.js,Promise,Q,我是新来的Q节点模块 如何解析promise对象的值 以下是我的例子: function fs_readFile (file, encoding) { var deferred = Q.defer() fs.readFile(file, encoding, function (err, data) { if (err) deferred.reject(err) else deferred.resolve(data) }) return deferred.pro

我是新来的Q节点模块

如何解析promise对象的值

以下是我的例子:

function fs_readFile (file, encoding) {
 var deferred = Q.defer()
 fs.readFile(file, encoding, function (err, data) {
  if (err) 
    deferred.reject(err)
  else 
    deferred.resolve(data)
 })
 return deferred.promise
}
现在我调用函数:

var promise=fs_readFile('myfile.txt').then(console.log, console.error);
现在我可以从中获取文件内容数据,然后实现回调函数,但如何从返回的对象获取文件内容数据呢。就像是同步的


有人能帮我吗

通过封装异步操作的结果来提供帮助,但由于操作尚未完成,您实际上无法同步获得结果。不过,您可以获得一些同步行为的外观。您得到了函数接受参数并返回值的概念。您还可以获得与同步代码中的错误相同的爬升堆栈的错误处理

在ES6(JavaScript的下一个版本,部分受一些最新浏览器支持)中,您还可以使用生成器来帮助您编写更同步的代码

考虑您的readFile操作,如果它是同步的,您可以编写如下内容:

function readJsonSync(filename) {
  return JSON.parse(fs.readFileSync(filename, 'utf8'));
}
在当前版本的JavaScript中,使用promise返回的版本,您可以编写

function readJson(filename) {
  return fs_readFile(filename, 'utf8').then(JSON.parse);
}
如果您希望对回调执行相同的操作,而不是承诺,那么您必须编写以下内容以获得正确的错误处理行为:

function readJsonCallback(filename, callback){
  fs.readFile(filename, 'utf8', function (err, res){
    if (err) return callback(err)
    try {
      res = JSON.parse(res)
    } catch (ex) {
      return callback(ex)
    }
    callback(null, res)
  })
}
使用ES6,您可以编写:

var readJson = Q.async(function* (filename){
  return JSON.parse(yield fs_readFile(filename, 'utf8'))
})
收益率
“等待”承诺,并为您提供分辨率值。需要注意的是,包含yield的函数必须包装在
Q.async
中,并返回一个承诺本身


如果你想更深入地了解这一点,或者只是喜欢视频而不是文本,我就这个话题做了一个演讲,你可以在YouTube上找到:

你不能;承诺不会奇迹般地使异步代码同步。您必须使用回调函数来访问文件内容。
function fs_readFile (file, encoding) {
var deferred = Q.defer()
fs.readFile(file, encoding, function (err, data) {
  if (err) 
    deferred.reject(err)
  else 
    deferred.resolve(data)
  })
  return deferred.promise.then(console.log, console.error)
}

var promise=fs_readFile('myfile.txt','utf-8')