如何让Promise摆脱长链?

时间:2014-04-28 09:46:52

标签: javascript promise q

我想分开我的代码逻辑。长链很难被条件控制。

我写了一个测试代码:

var Q, f, p;

Q = require('q');

f = function(t, info) {
  var deferred = Q.defer();
  setTimeout(function() {
    console.log(info);
    return deferred.resolve();
  }, t);
  return deferred.promise;
};

p = f(500, 0);

p.then(function() {
  return f(300, 1);
});

p.then(function() {
  return f(100, 2);
});

我希望结果是:

0
1
2

但我总是得到:

0
2
1

我有什么问题吗?

2 个答案:

答案 0 :(得分:3)

您必须将then链接起来,以便在返回的承诺上调用then

p = f(500, 0);
p.then(function() {
  return f(300, 1);
}).then(function() {
  return f(100, 2);
});

传递承诺没有问题,这是你已经做过的事情(f会回复承诺)。

答案 1 :(得分:2)

你需要链接承诺:

p = f(500, 0);

p = p.then(function() {
  return f(300, 1);
});

p = p.then(function() {
  return f(100, 2);
});

或更具惯用性:

f(500, 0).then(function() {
  return f(300, 1);
}).then(function() {
  return f(100, 2);
});