首页 > 解决方案 > 级联 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() 和其他函数。

感谢您的帮助和见解!

标签: node.jspromise

解决方案


那是因为您使用prototype. 在这种情况下Top.prototype绑定到this. 通常this是“在点之前”的对象。这就是为什么在第一次通话t.longRun1()中,thist

正确的调用是:

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


推荐阅读