2016-08-04 63 views
0

我目前正在尋找轉換使用Q.defer()承諾處理使用ES6承諾的庫。我理解如何將Q.defer()轉換爲Promise的基礎知識,但我遇到的每個示例都沒有討論我正在運行的結構,我需要將類實例變量從Q.defer()轉換爲承諾不會立即解決。例如,採取以下代碼。如何將Q.defer()轉換爲實例變量的Promise?

import 'Q' from 'q'; 
class Service { 
    constructor() { 
    this.items = Q.defer(); 

    // This would then make a call to some backend service... setTimeout to simulate. 
    setTimeout(() => { 
     this.items.resolve(['one', 'two', 'three']); 
    }, 1000); 
    } 
    getItems() { 
    return this.items.promise; 
    } 
} 

我想使用這個類,如下所示。

let service = new Service(); 
service.getItems().then((items) => { 
    console.log(items); 
}); 

目前,我正在看,你應該使用Promise.resolve()創建一個類似的結構,但是,如果我更換Q.defer()與Promise.resolve(),承諾沒有立即解析項目,這不是我想要的。這是我想的可能是替代品。

class Service { 
    constructor() { 
    this.items = Promise.resolve(); 

    // This would then make a call to some backend service... setTimeout to simulate. 
    setTimeout(() => { 
     this.items.then(() => { 
     return ['one', 'two', 'three']; 
     }); 
    }, 1000); 
    } 
    getItems() { 
    return this.items; 
    } 
} 

這不會起作用,因爲承諾立即解決...

如何轉換上面的代碼中使用的承諾?

回答

1

問題是deferred不是Promise specificationanti-pattern的一部分,所以本機Promise沒有相同的概念。 這將在本地工作,但我不確定你是否可以像這樣包裝你的方法。

class Service { 
    constructor() { 
    this.items = new Promise(deferred) 
    function deferred(resolve, reject) { 
     setTimeout(() => { 
     resolve(['one', 'two', 'three']); 
     }, 1000); 
    } 
    } 
    getItems() { 
    return this.items; 
    } 
} 
+0

我的目標是能夠立即撥打'''getItems'''。我將更新我的原始問題,以概述我希望如何使用這個課程,但這不適用於您提供的示例。我非常感謝您的反饋。 –

+0

@TravisTidwell您是否嘗試過建議的代碼? – robertklep

+0

我剛剛嘗試過,看起來好像這可能會起作用。我覺得你需要調用'''Promise.resolve()'''以獲得''''then'''方法來使用。我將把它插入我的圖書館,然後upvote如果它的工作!謝謝。 –

0

另一件可以用來解決這個問題的方法是使用下面的代碼創建一個Deferred類的Polyfill。

class Deferred { 
    constructor() { 
    this.promise = new Promise((resolve, reject) => { 
     this.resolve = resolve; 
     this.reject = reject; 
    }); 
    } 
} 

而這個現在可以像這樣使用...

class Service { 
    constructor() { 
    this.items = new Deferred(); 

    // This would then make a call to some backend service... setTimeout to simulate. 
    setTimeout(() => { 
     this.items.resolve(['one', 'two', 'three']); 
    }, 1000); 
    } 
    getItems() { 
    return this.items.promise; 
    } 
}