2016-08-22 64 views
2

我嘗試鏈接承諾。在getExternalMap()下面返回一個promise(處理ajax call => deferred.resolve()並返回deferred.promise)。 「第一鏈」被稱爲沒有問題,但「第二鏈」沒有被調用,爲什麼?Q鏈接不正確

我認爲這是寫得很好,但它不是,我也找不到爲什麼。

var self = this; 
getExternalMap().then(function() { 
     console.log("First chaining"); 
     var parsedMap = self.destinationsApiParser.getSortDestinations(); 
     return self.initProxies(parsedMap); 
    }).then(function() { 
     console.log('second chaining'); 
    }); 

this.initProxies = function(parsedMap) { 
    var deferred = Q.defer(); 
    var destinationsApiProxy = new DestinationsApiProxy(this.app, parsedMap); 
    deferred.resolve(); 
    return deferred.promise; 
} 
+4

在鏈的末尾添加一個catch()或者done()來查看任何錯誤。 – Sirko

+2

'initProxies'不應該返回一個承諾。它不是異步的。 – Bergi

+0

感謝sirko發現了這個問題,initProxies正在做狗屎,有點沉默地墜毀。 Bergi的評論也很好。謝謝你們倆 –

回答

0

如果我理解正確的話,你想這樣做,而不是:

var self = this; 
getExternalMap() 
    .then(() => console.log("1st chaining")) 
    .then(self.destinationsAPIParser.getSortDestinations) 
    .then(self.initProxies) 
    .then(() => console.log("2nd chaining")) 

this.initProxies = function(parsedMap) { 
    var deferred = Q.defer(); 
    var destinationsApiProxy = new DestinationsApiProxy(this.app, parsedMap); 
    deferred.resolve(); 
    return deferred.promise; 
} 

假設self.destinationsAPIParser.getSortDestinations返回一個承諾。