node.js - 级联 Promise 中缺少对象变量
问题描述
所以我一直在寻找答案,如果我的 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
所以在第二个 Promise 中似乎所有 Object 的this.
变量都消失了 :( 我认为由于这两个函数都属于 Object,它们会继承 Object 的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/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/apply
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/call
推荐阅读
- r - R中异常检测中的分组
- github - 我可以在提交消息中引用 github 中的问题而不关闭它吗
- java - 在 springboot 中从 RestControllers 的 RequestMapping 中删除 '/'
- python-3.x - 在python中存储一些数据(如键值对)的最佳方法是什么
- android - 如果我没有 SplashScreen.java 文件但我仍在使用 react-native-splash-screen 库怎么办?
- php - PDFlib PHP 将图像并排放置
- c++ - 循环调用时链表不接受新节点
- c# - 如何模拟 Jwt 不记名令牌以进行集成测试
- security - 如何使用 h2load 传递证书和密钥
- python - AttributeError: 'pyodbc.Cursor' 对象没有属性 'cursor' - Pandas & PyODBC