iT邦幫忙

1

nodejs promise問題

Han 2019-07-05 14:51:031611 瀏覽
  • 分享至 

  • xImage

我想取得Route裡面的list

使用下面物件
1.這樣的使用方式會把Route.refreshRoute綁定上去的then蓋掉嗎??
2.這樣的使用方式妥當嗎?還是會推薦什麼其他比較好的用法


var r = new Route() ;
//這邊想要監聽r.status的Promise完成了沒
r.status.then(function(){
    //Do what i want.
}) ;

class Route
{
    constructor()
    {
        this.status = null ;
        this.list = null ;
        this.refreshRoute() ;
    }
    
    // 07/05 15:00 >> 新增這個function
    //還是用這種方式取會比較好??
    //但就是很不希望寫到後面全部都要有async...
    async getRoute()
    {
        await this.status ;
        return this.list ;
    }
    
    refreshRoute()
    {
        var that = this ;
        //這裡的doGet回傳Promise
        this.status = Request.doGet() ;
        
        this.status.then(rs => {
            that.list = rs ;
        })
        
        return this ;
    }
}
fillano iT邦超人 1 級 ‧ 2019-07-05 16:18:56 檢舉
綁定的then不會被蓋掉,後續的then只會append上去。

getRoute()必須這樣用:r.getRoute().then(取值),就看這樣是否是你預期的。

另外,這樣還蠻多此一舉,因為如果你把refreshRoute裡面的then拿掉,那在r.status.then()就可以取得結果,不用繞這麼多彎。

其實這些自己寫簡單的POC就知道結果了...
Han iT邦研究生 1 級 ‧ 2019-07-05 16:32:58 檢舉
了解 感謝兩位大大的回答~
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

2
dragonH
iT邦超人 5 級 ‧ 2019-07-05 15:54:12
最佳解答

你原本的寫法應該會報錯吧

然後不知道為什麼要透過 status 來賦值給 list /images/emoticon/emoticon19.gif

這樣的寫法不知道是你要的嗎

codepen

class Route {
  constructor() {
    this.status = null ;
    this.list = null ;
    this.init = async() => {
      await this.refreshRoute();
      return this;
    }
  }
  async refreshRoute() {
    this.list = await doGet();
  }
}
const doGet = () => {
  return new Promise((resolve) => setTimeout(() => resolve('myList'), 3000));
}
const r = new Route() ;
r.init().then((myRoute) => {
  console.log(myRoute.list);
});

參考

Han iT邦研究生 1 級 ‧ 2019-07-05 16:33:44 檢舉

感謝~剛剛被一些邏輯卡住了QQ

marlin12 iT邦研究生 5 級 ‧ 2019-07-06 17:38:32 檢舉

可以再簡化為

class Route {
  constructor() {
    this.list = null;
  }
  async refreshRoute() {
    this.list = await doGet();
  }
}

const doGet = () => {
  return new Promise((resolve) => setTimeout(() => resolve('myList'), 3000));
}

(async () => {
  const r = new Route();
  await r.refreshRoute();
  console.log( r.list );
})();

另外,在實際應用上,還要加上[錯誤處理]。

Han iT邦研究生 1 級 ‧ 2019-07-08 09:41:21 檢舉

marlin12感謝~

我要發表回答

立即登入回答