Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/427.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何让承诺摆脱长链?_Javascript_Promise_Q - Fatal编程技术网

Javascript 如何让承诺摆脱长链?

Javascript 如何让承诺摆脱长链?,javascript,promise,q,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(50

我想分离我的代码逻辑。而且长链有点难以控制的条件

我编写了一个测试代码:

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
我做错了什么吗?

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

p = f(500, 0);
p.then(function() {
  return f(300, 1);
}).then(function() {
  return f(100, 2);
});
传递承诺没有问题,这是您在返回承诺时已经做的。

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

p = f(500, 0);
p.then(function() {
  return f(300, 1);
}).then(function() {
  return f(100, 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);
});

你需要把承诺连成链:

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

如果我想分离我的代码逻辑呢。或者我会得到一条长长的链条。有什么好办法吗?你从p回来的承诺。。。可以作为参数传递,并从其他点链接。你也可以把它们筑巢。我经常做这种事。当然,拥有一个长链是没有问题的。如果我想分离我的代码逻辑呢。或者我会得到一条长长的链条。有什么好办法吗?你从p回来的承诺。。。可以作为参数传递,并从其他点链接。你也可以把它们筑巢。我经常做这种事。当然,拥有一条长长的链条是没有问题的。