在给定方案中实施承诺的最佳方式是什么?

时间:2015-02-12 12:36:12

标签: javascript jquery promise angular-promise gameclosure

我正在使用D.js作为我们的javascript应用程序的promise库。 以下是我的示例代码:

function getData(deferred) {
  var data_one;

  // getInfo is returning a promise for async task
  getInfo()
   .then(function (resp_one) {
      data_one = resp_one;
      // getInfo2 is also returning another promise
      return getInfo2();
   })
   .then(function (resp_two) {
     deferred.resolve('prefix' + data_one + resp_two);
   });
};

function sample () {
  var d = D(),
    data = localStorage.getItem('key');

  if (data) {
    d.resolve(data);
  } else {
    getData(d);
  }
  return d.promise;
}

sample().then(function (data) {
  //do something with data.
});

我正在调用示例函数。样本函数和子函数中的实现遵循promise的编码标准吗? 我是承诺的新手,将延迟对象传递给其他函数解析/拒绝是否合适? 有没有更好的方法来实现上述功能?

提前致谢..

1 个答案:

答案 0 :(得分:2)

如果您以更自然的方式使用promises,您似乎可以改进代码。

首先,如果getData返回Promise,那么您不必传递deferred,这被视为反模式。您只需返回getInfo()即可。

另一件事,在sample函数中,如果您的data可能已经可用,则使用D.promisify方法返回已解决的具有非承诺值的承诺很方便:

function getData() {
    var data_one;
    return getInfo().then(function (resp_one) {
        data_one = resp_one;
        return getInfo2();
    })
    .then(function (resp_two) {
        return 'prefix' + data_one + resp_two;
    });
};

function sample() {
    var data = localStorage.getItem('key');
    return data ? D.promisify(data) : getData();
}

sample().then(function (data) {
    //do something with data.
});