[英]Accessing outer variables within a Promise chain
我想知道我是否正在使用此示例代碼做任何可怕的事情:
something.on('register', function(user) {
client.setAsync(config.id, user.id) // From a package (I can't set the return value)
.then(function(){
return user; // is this OK?
})
.then(handleNewUser)
.then(getSomeStuff)
.catch(function(err) {
console.error("Promise chain error: ", err);
});
});
是否會有任何范圍問題? (用戶不是我認為的競爭條件?)
我可以以更優雅的方式傳遞用戶嗎?
如果有的話,你的模式更好地保證相同的user
比,如果client.setAsync()
是返回一個user
。 如果程序包寫得不好或記錄錯誤,您可以完全收回其他一些對象。
但有一個附帶條件 - 中間client.setAsync()
進程無法擴充您的user
對象。 除非user
本身作為參數傳遞給client.setAsync()
,否則沒有機制可以這樣做。 只能假設在這種情況下這不是問題。
使用你擁有的東西,唯一明顯的改進就是用少一個.then()
形成你的鏈,如下所示:
something.on('register', function(user) {
client.setAsync(config.id, user.id) // From a package (I can't set the return value)
.then(function() {
return handleNewUser(user);
})
.then(getSomeStuff)
.catch(function(err) {
console.error("Promise chain error: ", err);
});
});
您可能喜歡閱讀這個問題及其答案 。 特別是,找到標題為“嵌套(和)閉包”的答案,您將看到在閉包中訪問先前的值是完全合理和正確的。
這有點奇怪;
有沒有優勢,使承諾庫調用handleNewUser
函數本身給了你必須添加額外的then
函數返回user
,使其工作。
我建議您在then
函數中自己調用該函數:
something.on('register', function(user) {
client.setAsync(config.id, user.id)
.then(function(){ return handleNewUser(user); }
.then(getSomeStuff)
.catch(function(err) {
console.error("Promise chain error: ", err);
});
});
[注意:我沒有測試過這個版本]或者,您可以使用部分應用的功能來使它更清潔:
something.on('register', function(user) {
client.setAsync(config.id, user.id)
.then(handleNewUser.bind(this, user); }
.then(getSomeStuff)
.catch(function(err) {
console.error("Promise chain error: ", err);
});
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.