在 Bluebird Promise 链中传递上下文的问题

Problem with passing context in Bluebird Promise chain

我遇到过需要将一些值传递给 Promise 处理程序的情况。以下是情况示例

function promiseFunct(x){
    return new Promise(function(resolve, reject){
       if(x>0) resolve(x);
       else if(x==0) resolve(1);
       else resolve(0);
  });
}

promiseFunct(-100).then(function(response){
  var someObj = { len: 124 };
  return promiseFunct(response).bind(someObj);
}).then(function(response){
    if(this.len) console.log(this.len); //not getting access here, this is Window
});

我试图绑定 someObj 然后在处理程序中访问它,但没有成功。除了传递给 Promise 然后在 Promise 内部解析之外,是否有一些优雅的解决方案可以将某些对象传递给 Promise 处理程序?

先看看哪里出了问题:

promiseFunct(-100).then(function(response){
  var someObj = { len: 124 };
  return promiseFunct(response).bind(someObj);
})

returns 来自 then 履行处理程序的绑定承诺。

Promise 代码会等到绑定的 promise 被解决,然后再将其状态(已完成或拒绝)和值(数据或拒绝原因)传递到 promise 链。为此,它 内部 调用 then 绑定承诺以获得其结果,并且它是使用绑定的 this 值调用的内部处理程序 - 这他们根本不理会。

虽然Bluebird documentation表示

... Additionally promises derived from a bound promise will also be bound promises with the same thisArg ...

这不适用于这种情况:承诺链中的所有承诺都是在链被定义时同步创建的,在链的任何异步处理开始之前。

由于 promise 链只在处理程序之间传递单个值,最简单的方法可能是根据需要传递具有任意数量的其他值的名称空间对象。由于后续的处理程序已经需要知道在哪里寻找额外的数据,所以变化应该不会太大:

function promiseFunct(x){
    return new Promise(function(resolve, reject){
       if(x>0) resolve(x);
       else if(x==0) resolve(1);
       else resolve(0);
  });
}
promiseFunct(-100).then(function(response){
console.log( "response " + response);
  var someObj = { len: 124 };
  var ns = {response, rest: someObj};
  return ns;
}).then(function({response, rest}){
    if(rest.len) console.log(rest.len);
    console.log(response);
}); 

找到了简单的解决方案,但不能保证它是最优雅的。

promiseFunct(-100).bind({}).then(function(response){
  this.len = 124 ;
  return promiseFunct(response);
}).then(function(response){
    if(this.len) console.log(this.len); // showing 124
});
例如,

使用 bind({}) 设置自己的 Promise 链上下文,不会与 Window 交叉。如果我在外面有 len 值,我可以使用 bind({len: len}) 然后我可以使用 this.propertyName 来获取或设置所需的 属性 以便在下一个处理程序中使用。