bluebird Promise链这个引用

时间:2018-01-09 08:49:09

标签: javascript node.js promise bluebird

我正在努力学习一门有几个功能的课程。他们每个人都会返回一个承诺。

我的问题是,在第一次返回Promise之后,下一个函数中的this-reference不是类对象而是全局节点对象。

以下是一些示例代码:

index.js:

"use strict";

const debug = require("./dbg.js");
const testClass = require("./testClass.js");


const dbg = new debug();

const tc = new testClass(dbg);


tc.printTestMessage()
    .then(tc.Test1)
    .then(tc.Test2)
    .then(tc.Test3);

testClass.js:

"use strict";


const Promise = require("bluebird");

let testClass = function(dbg) {

let self = this;

self._dbg = dbg;



};

testClass.prototype.printTestMessage = function() {

    let self = this;

    return new Promise(function(resolve) {

        self._dbg.printDebug(3, "testClass - printTestMessage", "start printing...");

        setTimeout(function() {

            self._dbg.printDebug(3, "testClass - printTestMessage", "finished printing...");
        resolve();

        }, 2000);

    });

};


testClass.prototype.Test1 = function() {

    let self = this;

    return new Promise(function(resolve) {

        self._dbg.printDebug(3, "testClass - Test1", "start printing...");

        setTimeout(function() {

            self._dbg.printDebug(3, "testClass - Test1", "finished printing...");
            resolve();

        }, 2000);

    });

};


testClass.prototype.Test2 = function() {

    let self = this;

    return new Promise(function(resolve) {

        self._dbg.printDebug(3, "testClass - Test2", "start printing...");

       setTimeout(function() {

            self._dbg.printDebug(3, "testClass - Test2", "finished printing...");
            resolve();

        }, 2000);

    });

};


testClass.prototype.Test3 = function() {

    let self = this;

    return new Promise(function(resolve) {

        self._dbg.printDebug(3, "testClass - Test3", "start printing...");

        setTimeout(function() {

            self._dbg.printDebug(3, "testClass - Test3", "finished printing...");
            resolve();

        }, 2000);

    });

};




module.exports = testClass;

有关如何将每个函数粘贴到类引用的任何帮助吗?

1 个答案:

答案 0 :(得分:-1)

自己找到它:每个新的Promise都必须在最后添加.bind(self)。

例如:

testClass.prototype.Test3 = function() {

    let self = this;

    return new Promise(function(resolve) {

        self._dbg.printDebug(3, "testClass - Test3", "start printing...");

        setTimeout(function() {

            self._dbg.printDebug(3, "testClass - Test3", "finished printing...");
            resolve();

        }, 2000);

    }).bind(self); //<-- this is the important part

};