所以我一直在寻找答案,所以很抱歉,如果我的Google Foo不好...
我有一个Node.JS模块,它具有Promise函数,有时会调用其他Promise函数(这是示例代码,但其行为与我实际尝试编写的代码相同):
"use strict";
function Top() {
this.var1 = "";
this.var2 = [];
this.debug = 0;
}
Top.prototype.longRun1 = function() {
return new Promise((resolve,reject) => {
// call out to network service here...
this.var1 = "LR1";
this.var2.push(this.var1);
Top.prototype.longRun2().then((out) => {
resolve(out);
}).catch((err) => {
console.log("LR2:" + err);
});
});
}
// longRun2() can be called by other non-Promise functions.
Top.prototype.longRun2 = function() {
return new Promise((resolve,reject) => {
// call to a second network service...
this.var1 = "LR2";
this.var2.push(this.var1);
resolve(this.var2.length);
})
}
Top.prototype.dump = function() {
return this.var2;
}
module.exports = Top;
像这样使用:
var Top = require('./test2.js');
var t = new Top();
t.longRun1().then((out) => {
console.log(out);
console.log(t.var1);
console.log(t.dump());
console.log(t.var2.length);
}).catch((err) => {
console.log("TOP:" + err);
});
运行此命令时,出现以下错误: LR2:TypeError: Cannot read property 'push' of undefined
因此,所有对象的this.
变量似乎都在第二个Promise中消失了:(我认为由于这两个函数都属于对象,因此它们将继承对象的this.
变量,但似乎我的想法是错误的。
为了引用第二个Promise函数中的Object变量,是否需要添加某种范围定义?
longRun2()函数需要longRun1()的结果,因此顺序很重要。一旦调用longRun1(),就可以直接调用longRun2()和其他函数。
感谢您的帮助和见解!
这是因为您使用调用了该方法prototype
。在这种情况下Top.prototype
,绑定到this
。通常this
,对象是“点之前”。这就是为什么在第一个电话t.longRun1()
中this
是t
。
正确的电话是:
this.longRun2().then((out) => {
resolve(out);
}).catch((err) => {
console.log("LR2:" + err);
});
如果要对this
变量进行更多控制,可以使用以下方法之一:
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Function/apply
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Function/bind
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Function/call
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句