【问题标题】:Q.js - Using deferredQ.js - 使用延迟
【发布时间】:2014-03-07 01:05:28
【问题描述】:

如何从下面的示例中获取文本的值?

Q.js 有一个使用 Deferred 的例子:

var deferred = Q.defer();
FS.readFile("foo.txt", "utf-8", function (error, text) {
    if (error) {
        deferred.reject(new Error(error));
    } else {
        deferred.resolve(text);
    }
});
return deferred.promise;

在这种情况下,使用了一个节点异步函数。我想要做的是从返回的 deferred.promise 中获取文本的值。当我 console.log(deferred.promise) 我得到这个:

{ promiseSend: [Function], valueOf: [Function] }

我做错了什么(因为我只是从这里复制/粘贴示例:https://github.com/kriskowal/q#using-deferreds)或者我还需要做什么才能真正从文件中获取该文本?

我知道 node.js 具有上述调用的同步版本 - 我的目标是了解 deferred 如何与此库一起使用。

【问题讨论】:

    标签: node.js deferred


    【解决方案1】:

    见https://github.com/kriskowal/q#adapting-node

    可以用类似nodejs的方式重写:

    var read = Q.nfcall(FS.readFile, FS, "foo.txt", "utf-8");
    read().then( function (text) { console.log(text) } );
    

    【讨论】:

      【解决方案2】:

      您可以通过 Promise 的 .then() method 获取值:

      function read() {
          // your snippet here...
      }
      
      read().then(function (text) {
          console.log(text);
      });
      

      此外,错误处理程序可以作为第二个参数传递给 .then() 或使用 .fail() 方法:

      read().fail(function (err) {
          console.log(err);
      });
      

      【讨论】:

        【解决方案3】:
        Q = require('q');
        FS = require('fs');
        
        function qread() {
          var deferred = Q.defer();
          FS.readFile("foo.txt", "utf-8", function (error, text) {
            if (error) {
          deferred.reject(new Error(error));
            } else {
          deferred.resolve(text);
            }
          });
          return deferred.promise;
        };   
        
        var foo = qread();
        
        setTimeout(function() {
          console.log(""+foo);
        },1000);
        

        很奇怪你看不到console.log(foo) 的输出。不知道为什么。

        在此处查看更多示例https://github.com/kriskowal/q/wiki/Examples-Gallery

        【讨论】:

          【解决方案4】:
          deferred.promise.then(function (text) {
            console.log(text); // Bingo!
          });
          

          【讨论】:

            【解决方案5】:
            Q = require('q');
            FS = require('fs');
            
            var deferred = Q.defer();
            FS.readFile("client-02.html", "utf-8", function (error, text) {
              if (error) {
                deferred.reject(new Error(error));
                } else {
                deferred.resolve(text);
                }
            return deferred.promise.done( setTimeout(console.log(text),1000 ));
            });
            

            【讨论】:

              猜你喜欢
              • 2015-07-18
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-08-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多