在给定场景中实现承诺的最佳方式是什么?

What is the best way to implement promise in the given scenario?

我正在使用 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 的编码标准? 我是 promises 的新手,将延迟对象传递给其他函数到 resolve/reject 好吗? 有没有更好的方法来实现以上功能??

提前致谢..

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

首先,如果 getData return 是一个 Promise,那么您不必传递 deferred,这被认为是反模式。你只是简单地 return getInfo()

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

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.
});