如何解决nodejs promises中的值

时间:2013-12-27 12:47:05

标签: 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.promise
}

现在我正在调用函数:

var promise=fs_readFile('myfile.txt').then(console.log, console.error);

现在我可以从我的文件内容数据中获取回调函数,但是如何从返回的promises对象中获取文件内容数据。像是同步的。

任何人都可以帮助我!!

2 个答案:

答案 0 :(得分:1)

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

在ES6(JavaScript的下一个版本,部分最新浏览器部分支持)中,您还可以获得可以帮助您编写更多同步看似代码的生成器。

考虑你的readFile操作,如果它是同步的,你可以编写类似的东西:

function readJsonSync(filename) {
  return JSON.parse(fs.readFileSync(filename, 'utf8'));
}

承诺在当前版本的JavaScript中返回版本,您可以编写

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“等待”承诺,并为您提供分辨率值。需要注意的是,包含yield的函数必须包含在Q.async中并且将自己返回一个promise。

如果您想更深入地了解这个内容,或者只是更喜欢视频到文字,我会在YouTube上发表有关此主题的演讲:http://youtu.be/qbKWsbJ76-s

答案 1 :(得分:0)

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')