Javascript AngularJS:将附加参数传递给链接承诺

Javascript AngularJS:将附加参数传递给链接承诺,javascript,angularjs,promise,angular-promise,Javascript,Angularjs,Promise,Angular Promise,我想链接一些由服务返回的承诺。只要返回承诺的某些方法不需要额外的参数,这就行了。这是我的例子: var first = function() { var d = $q.defer(); $timeout(function() { d.resolve("first resolved") }, 100) return d.promise; }; var second = function(val) { console.log("value of val: ", val)

我想链接一些由服务返回的承诺。只要返回承诺的某些方法不需要额外的参数,这就行了。这是我的例子:

var first = function() {
  var d = $q.defer();
  $timeout(function() {
    d.resolve("first resolved")
  }, 100)
  return d.promise;
};

var second = function(val) {
  console.log("value of val: ", val);
  var d = $q.defer();
  $timeout(function() {
    d.resolve("second resolved")
  }, 200)
  return d.promise;
};

first().then(second).then(function(value) {
  console.log("all resolved", value);
});
这正如预期的那样有效。但是,如果我的服务
second
需要一个额外的参数
val
来完成它的工作,该怎么办?使用上述方法,
val
的值是
第一次解析的值
,因为它是从
第一次
获得解析值的

有没有办法不嵌套这样的匿名函数:

first().then(function() {
  return second("foobar").then(function(value) {
    console.log("all resolved", value);
  });
});
我正在考虑使用
$q.all
,但是我想你不能为你的承诺指定一个订单。

当然。第一种方式:

first()
  .then(function() {
    return second("foobar");
  })
  .then(function(value) {
    console.log("all resolved", value);
  });
第二种(更简单)方法:


不客气。重要的是,您必须始终记住,函数只能由承诺调用。因此,如果需要其他参数或需要使用给定值执行某些操作,则必须将其包装或绑定,然后将普通函数传递给
调用。然后该函数可以返回另一个承诺。@Mawg在这种情况下,您应该返回一个包含所需值的对象或数组。您能举一个例子,说明一个非常小的Mawg吗?;-)
$timeout
已经返回了一个承诺,不需要
$q.defer
我知道,这只是为了演示。在我的真实案例中,我有一个http调用,然后对数据进行一些处理。所以我确实需要额外的
$q.defer
uhh$http也已经返回了一个承诺,您可以
。然后
对其进行额外处理并返回该承诺。。。无法对我没有看过的代码做出判断,但它听起来仍然像是延迟反模式。您只需要
$q.defer
,就可以对回调API进行操作。
first()
  .then(second.bind(null, "foobar"))
  .then(function(value) {
    console.log("all resolved", value);
  });