2016-11-25 39 views
0

我想用異步程序包運行多個異步任務。 但我有JavaScript原型訪問問題。「this」return在原型函數中未定義

這裏是我的代碼示例:

var env = function(options) { 
 
    this.options = options; 
 
} 
 

 
env.prototype.run = function() { 
 
    
 
    var self = this, 
 
    async.series([ 
 
    self.task1, 
 
    self.task2 
 
    ], function done(responses) { 
 
     console.log(responses); 
 
    }); 
 
} 
 

 

 
env.prototype.task1 = function() { 
 
    console.log(this.options); // undefined 
 
    // logic code... 
 
} 
 

 

 

 
var foo = new env({foo: 'bar'}); 
 
foo.run(); // undefined - from console.log

不知道爲什麼我不能訪問我的對象

+1

按th'Run代碼snippet'按鈕,看看'未捕獲的SyntaxError:意外token' – GillesC

+1

堆棧片段是** **可運行的例子,但以上不可運行。可運行的示例非常有用,因爲它可以確保您沒有遺漏重要信息,並且人們可以看到問題。這也讓人們很容易向你展示一個可行的解決方案。如果你不打算讓它運行,只需使用一個代碼塊(''}'工具欄按鈕),但我鼓勵你繼續使用片段 - 讓它們可以運行。 –

+0

剛剛意識到,儘管演示文稿與平時有點不同,但內容上,這是我剛剛鏈接的問題的重複。希望這個問題能夠幫助那些使用'async.series'的人有同樣的問題。 –

回答

1

此代碼的 '這個' 特性

async.series([ 
    self.task1, 
    self.task2 
], function done(responses) { 
    console.log(responses); 
}); 

只是將函數引用傳遞到async.series,但沒有做任何事情來確保this在被調用時是正確的。

除非async.series你使用提供了一種方法來告訴它使用什麼this,你可以很容易地解決bind問題:

async.series([ 
    self.task1.bind(self),  // *** 
    self.task2.bind(self)   // *** 
], function done(responses) { 
    console.log(responses); 
}); 

這裏有一個簡單的例子演示問題和解決方案:

var obj = { 
 
    property: "testing", 
 
    wrong: function() { 
 
    setTimeout(this.task1, 10); 
 
    }, 
 
    right: function() { 
 
    setTimeout(this.task1.bind(this), 20); 
 
    }, 
 
    task1: function() { 
 
    console.log("task1 says the property is " + this.property); 
 
    } 
 
}; 
 

 
obj.wrong(); 
 
obj.right();


端注:如果您使用的是ES2015兼容環境

env.prototype.run = function() { 
    async.series([ 
    this.task1.bind(this), 
    this.task2.bind(this) 
    ], function done(responses) { 
     console.log(responses); 
    }); 
}; 

另一種選擇:除非你使用self你有沒有內部run顯示的東西,你不需要它了(或transpiling)是包裝你的任務箭頭功能:

// Requres ES2015 support 
env.prototype.run = function() { 
    async.series([ 
    (...args) => this.task1(...args), 
    (...args) => this.task2(...args) 
    ], function done(responses) { 
     console.log(responses); 
    }); 
}; 
+0

但在這個示例代碼中,我看到** this **引用了右** task1 **函數,因爲我從console.log() –

+0

@SimonBruneaud獲得了輸出消息:是,右側的*函數*。但是該函數被*稱爲*,並且'this'的值錯誤。 –

+0

但是,綁定使console.log工作,謝謝。 我會多讀一點關於這個**綁定**功能 –