簡體   English   中英

訪問Promise鏈中的外部變量

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM