q-何时返回如“defer.resolve(myData); return defer.promise;” VS只是在promise链中“返回myData”

时间:2016-06-12 05:45:36

标签: javascript promise q deferred resolve

我一直在尝试在我的node.js服务器上编写更好的代码,并在阅读了以下一些博客文章之后:

我仍然不确定我是否以“正确的方式”将我的数据沿着承诺链返回。

我无法确定什么时候返回或传递数据这样的承诺

案例1

var promise = function () {
    var defer = q.defer();
    var myData = "hi"
    defer.resolve(myData);
    return d.promise;
};

或者像这样。

案例2

   var promise = function () {
        var myData = "hi"
        return myData;
    };

我假设如果我知道某些东西将被退回,而承诺链不可能破坏,那么使用案例2 ,但如果他们是一个变化它可能会失败(即它从网络呼叫返回数据但用户离线)然后使用案例1 ,以便它可以处理这两种情况。这是正确的还是我对这个流程/过程的工作方式有误解。

2 个答案:

答案 0 :(得分:1)

在这两种情况下,当您在第一种情况下将其包装在一个承诺中时,您将返回一个立即知道或计算的结果。是否要执行此操作取决于如果结果是异步计算的,则对函数的调用者是否应该是透明的。如果您返回一个promise,您可以稍后更改函数的实现,以异步计算或检索结果。

两个提示:

  1. 您未在案例2中使用承诺,因此请勿调用您的函数promise
  2. 在第一种情况下,您可以return q("hi");将文字包装在一个承诺中。

答案 1 :(得分:0)

  1. 承诺是那些参与回调地狱的人,这意味着你的工作是异步和链接的
  2. 对于像$ .ajax()这样的简单情况.adccess(callback1).fail(callback2)是一种承诺 3.你的情况不是异步的,可能是这样的:
  3. 
    
    var promise1 = function() {
      //async get file name
    }
    
    var promise2 = function(filename) {
      var defer = q.defer();
      var myData = "hi"
    
      //async
      fs.readFile(filename, 'utf-8', function(err, data) {
          if (err) {
            defer.reject(err);
          } else {
            defer.resolve(myData);
          }
        }
      }
      return d.promise;
    };
    var promise3 = function(data) {
      //use data do something
    }
    
    var onError(err) {
      console.log(err);
    }
    
    var onDone(result) {
      console.log(result)
    }
    
    //your logic might look like
    promise1.then(promise2).then(promise3).catch(onError).done(onDone);