Javascript 蓝鸟承诺范围

Javascript 蓝鸟承诺范围,javascript,promise,bluebird,Javascript,Promise,Bluebird,我刚刚开始用承诺来清理一些“回调地狱” 我决定尝试bluebird,我正在浏览器中运行它,但立即遇到了范围问题 有没有办法在新的承诺中设置thisArg?下面的示例显示promise解析器中的“this”值设置为浏览器窗口,但我希望将其设置为周围的范围,以便轻松访问成员变量 我注意到有一个.bind()方法,但它只作用于“then()”方法,而不是promise。我也意识到我可以在promise和use闭包之前使用“var me=this”,但如果可能的话,我想避免它 function MyOb

我刚刚开始用承诺来清理一些“回调地狱”

我决定尝试bluebird,我正在浏览器中运行它,但立即遇到了范围问题

有没有办法在新的承诺中设置thisArg?下面的示例显示promise解析器中的“this”值设置为浏览器窗口,但我希望将其设置为周围的范围,以便轻松访问成员变量

我注意到有一个.bind()方法,但它只作用于“then()”方法,而不是promise。我也意识到我可以在promise和use闭包之前使用“var me=this”,但如果可能的话,我想避免它

function MyObject() {
    this.value = 7;
}

MyObject.prototype.getValue = function () {
    return new Promise(function (resolve) {
        // some request/processing that takes a long time
        var result = Ajax.request(...);

        resolve({
            value: this.value,
            result: result
        });
        // 'this' is set to window instead of the instance,
        // resulting in this.value as undefined
    });
}

var obj = new MyObject();
obj.getValue().then(function (value) {
    console.log(value); // preferably outputs 7
})

不,没有。你当然可以,但你不需要

当执行繁重的处理并异步获取值时,您希望获得该值的承诺。您不需要将结果值设置为原始实例的属性

MyObject.prototype.getValue = function () {
    return new Promise(function(resolve) {
        // lots of processing to make a `value`
        resolve(value); // no `this` at all!
    });
};
如果您想同步获取在实例上设置的
.value
,则不需要
Promise
构造函数。仅用于对现有价值作出承诺:

MyObject.prototype.getValue = function () {
    // TODO: lots of processing
    return Promise.resolve(this.value);
};
或者,在您的情况下,甚至:


不,没有。你当然可以,但你不需要

当执行繁重的处理并异步获取值时,您希望获得该值的承诺。您不需要将结果值设置为原始实例的属性

MyObject.prototype.getValue = function () {
    return new Promise(function(resolve) {
        // lots of processing to make a `value`
        resolve(value); // no `this` at all!
    });
};
如果您想同步获取在实例上设置的
.value
,则不需要
Promise
构造函数。仅用于对现有价值作出承诺:

MyObject.prototype.getValue = function () {
    // TODO: lots of processing
    return Promise.resolve(this.value);
};
或者,在您的情况下,甚至:


这与其说是一个答案,不如说是一个评论,因为它是基于主要观点的

在rar的情况下,我需要这样的代码:

在这种情况下,
Ajax.requestAsync
将是
Ajax.request
的预期版本

我知道这可能会把你的问题转移到另一个地方

MyObject.prototype.getValue = function () {
    return Ajax.requestAsync(...)
    .bind(this)
    .then(function(result) {
        return {
              value: this.value,
              result: result
            }
    });
}
或者像这样:

 MyObject.prototype.getValue = function () {
    var returnValue = {
        value: this.value
    };

    return Ajax.requestAsync(...)
    .then(function(result) {
        returnValue.result = result;
        return returnValue;
    });
}
A很少使用这样的结构:

MyObject.prototype.getValue = function () {
  return Promise.all([this, Ajax.requestAsync(...)])
  .spread(function(object, result) {
      return {
        value: object.value,
        result: result
      };
  });
}

这与其说是一个答案,不如说是一个评论,因为它是基于主要观点的

在rar的情况下,我需要这样的代码:

在这种情况下,
Ajax.requestAsync
将是
Ajax.request
的预期版本

我知道这可能会把你的问题转移到另一个地方

MyObject.prototype.getValue = function () {
    return Ajax.requestAsync(...)
    .bind(this)
    .then(function(result) {
        return {
              value: this.value,
              result: result
            }
    });
}
或者像这样:

 MyObject.prototype.getValue = function () {
    var returnValue = {
        value: this.value
    };

    return Ajax.requestAsync(...)
    .then(function(result) {
        returnValue.result = result;
        return returnValue;
    });
}
A很少使用这样的结构:

MyObject.prototype.getValue = function () {
  return Promise.all([this, Ajax.requestAsync(...)])
  .spread(function(object, result) {
      return {
        value: object.value,
        result: result
      };
  });
}

所以我试图了解一般规则,承诺应该只返回其内部生成/获取的内容,而不返回任何内容?如果我希望用实例上已有的值来扩充返回的结果,该怎么办?我只是想避免反模式。我意识到我的示例可以使用Promise.resolve,但我想它希望在Ajax调用的结果中包含this.value。我认为您应该强调
Promise.method
在这里的作用,它正好解决了这个问题。也,如果不涉及异步计算,那么返回一个promise
this.value
是没有意义的。@Brendannable您应该只使用promise构造函数来编写逻辑,将回调代码转换为promisified代码-对于您拥有的链
。bind
@BenjaminGruenbaum:我认为返回一个promise的原因是
TODO:在不更改返回类型(API)的情况下,应该修复大量的处理过程。@Brendannable:是的,从
承诺
构造函数承诺返回的内容应该只在其内部生成/获取-通常您甚至不需要使用
承诺
构造函数,但可以使用它。使用结果扩充实例是一种反模式,使用实例值扩充结果可以在
中完成。然后()
回调(可能是绑定的)-例如,请参阅t.niese的comment-answer。因此,我试图了解一般规则,承诺应该只返回其内部生成/获取的内容?如果我希望用实例上已有的值来扩充返回的结果,该怎么办?我只是想避免反模式。我意识到我的示例可以使用Promise.resolve,但我想它希望在Ajax调用的结果中包含this.value。我认为您应该强调
Promise.method
在这里的作用,它正好解决了这个问题。也,如果不涉及异步计算,那么返回一个promise
this.value
是没有意义的。@Brendannable您应该只使用promise构造函数来编写逻辑,将回调代码转换为promisified代码-对于您拥有的链
。bind
@BenjaminGruenbaum:我认为返回一个promise的原因是
TODO:在不更改返回类型(API)的情况下,应该修复大量的处理过程。@Brendannable:是的,从
承诺
构造函数承诺返回的内容应该只在其内部生成/获取-通常您甚至不需要使用
承诺
构造函数,但可以使用它。使用结果扩充实例是一种反模式,使用实例值扩充结果可以在
中完成。然后()
回调(可能是绑定的)-有关示例,请参阅t.niese的注释答案。