【问题标题】:how to resolve values in nodejs promises如何解析 nodejs 承诺中的值
【发布时间】:2014-03-08 02:29:39
【问题描述】:

我是 Promise 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);

现在我可以从中获取我的文件内容数据,然后执行回调函数,但是我如何从返回的 Promise 对象中获取我的文件内容数据。喜欢同步。

谁能帮帮我!!

【问题讨论】:

  • 你不能;承诺不会奇迹般地使异步代码同步。您必须使用回调函数来访问文件内容。

标签: node.js promise q


【解决方案1】:

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

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

如果您想更深入地了解这一点,或者只是更喜欢视频而不是文字,我在 YouTube 上就该主题进行了一次演讲:http://youtu.be/qbKWsbJ76-s

【讨论】:

    【解决方案2】:
    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')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-29
      • 2016-06-22
      • 2020-03-03
      • 2019-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多