2016-11-22 57 views
0

我试图链Q承诺不“那么”,所以最终的链条是这样的:链的承诺不使用“然后”带Q库

var foo = new Foo(); 
foo 
.method1() 
.method2() 
.method3(); 

如何实现Foo的方法,使每一个一旦前一个承诺得到解决,就会被执行?

这个问题被标记为this one的确切副本,但我试图用Q lib而不是jQuery来实现。

+0

回报'this'关键字在JavaScript – Mahi

+0

除非美孚为Q的扩展,'this'并未真正发挥作用。 'method1'返回的东西本身必须包含一个'method2',只有在'method1'解析后才能调用它自己。 – Brian

回答

1

我不知道你是否会用这个获得任何东西。

我想你可以做这样的事情:

function Foo() { 
    var self = this, 
     lastPromise = Promise.resolve(); 

    var chainPromise = function(method) { 
    return function() { 
     var args = Array.prototype.slice.call(arguments)) 
     lastPromise = lastPromise.then(function(){ 
     return method.apply(self, args); 
     }); 
     return self; 
    } 
    } 

    this.method1 = chainPromise(function() { 
    // do the method1 stuff 
    // return promise 
    }); 

    this.method2 = chainPromise(function() { 
    // do the method2 stuff 
    // return promise 
    }); 

    // etc... 
} 
+1

以'lastPromise = Promise.resolve()'开头并避免分支 – Bergi

+1

如果你链接到'lastPromise',你忽略了'arguments' – Bergi

+0

你们都对,我要编辑答案 – jcarrenog