2016-08-04 27 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; 
    } 
}