2

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

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 的编码标准?我是新的承诺,将延迟对象传递给其他函数来解决/拒绝是否很好?有没有更好的方法来实现上述功能?

提前致谢..

4

1 回答 1

2

如果您以更自然的方式使用 Promise,看起来您可以改进代码。

首先,如果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.
});
于 2015-02-12T12:44:07.760 回答