我是承诺的新手但我的理解是.then()的参数是2个函数(可选)来处理onfulfilled和onreject。这些函数可以返回值,承诺或抛出错误。
我还看到了履行函数是其他地方定义的函数的示例,例如:
function onFulfill(){...}
promise.then(onFulfill)
我试图有一个自定义对象,它有一些函数,可以是这些onFulfill等函数,参见下面的例子。
function Test() {
this.value = "something"
}
Test.prototype.makePromise = function() {
console.log(this)
return Promise.resolve();
};
Test.prototype.test = function() {
console.log(this)
};
var T = new Test();
T.test()
var P = Promise.resolve().then(T.makePromise)
我的问题出现了,因为当我打电话给T.test()时,印刷的“这个”就像预料的那样。但是当我将T.makePromise传递给.then()函数时,它将全局对象打印为“this”,我不明白为什么会出现这种情况。
我知道我可以通过以下方式让它发挥作用:
var P = Promise.resolve().then(()=>{return T.makePromise()})
但我不明白为什么我应该这样做。
谢谢。如果这是一个非常基本的问题,我很抱歉。也不是我认为这很重要,但我在节点中使用它。
答案 0 :(得分:2)
由于您正在传递函数引用,因此它失去与对象T
的连接。您没有传递T
+ makePromise
,而是传递makePromise
,就像它是一个独立的函数一样。因此T
在调用上下文中不能再this
。
就这样写:
const P = Promise.resolve().then(() => T.makePromise())
现在,在调用makePromise
时,范围内可以使用T
并自动绑定到this
。
答案 1 :(得分:1)
您可以尝试类似
的内容var P = Promise.resolve().then(T.makePromise.bind(T))
答案 2 :(得分:1)
这主要是关于this
的问题。因为then
函数正在调用T.makePromise
,所以调用站点不再是Test
的上下文,而是全局上下文。
this
反映了使用this
调用函数的上下文。一旦你将其传递给异地,除非事先this
,否则你无法控制bind
的内容。