2017-05-13 89 views
0

我特別想promisify model.fetch方法,所以當我創建模式,我promisifying骨幹藍鳥PromisifyAll的骨幹不解決

function (_, Backbone, Promise) { 
    Backbone = Promise.promisifyAll(Backbone); 
    var Diagram = Backbone.Model.extend({...}); 
} 

但後來我試圖使用fetchAsync,我圖模型沒有任何反應。

diagram.fetchAsync() 
    .then(function() { 
    console.log('success'); 
    }, 
    function() { 
    console.log('err'); 
    }) 
    .catch(function() { 
     console.error('fetch failed'); 
    }); 

在控制檯這個承諾看起來像這樣

_bitField: 0 
_fulfillmentHandler0: undefined 
_promise0: undefined 
_receiver0: undefined 
_rejectionHandler0: undefined 
__proto__: Object 

我認爲fetchAsync調用的同步和Ajax調用沒有在這個承諾返回決心非promisifyed版本。如果我寫了一些愚蠢的東西,我對承諾很陌生,所以很抱歉。

在Promisifying主幹上,我發現在google中只有很少的信息,只有npm上的幾個包,但我不想包含額外的包,特別是如果它們不受歡迎。

+0

'fetch'已經返回骨幹承諾,無需promisify它。 –

+0

此外,'promisify'只適用於具有節點函數約定的函數, –

+0

thx @BenjaminGruenbaum你是對的!我發現我需要在Bluebird.resolve()中包裝jqXHR諾言,之後我可以將它用作藍鳥諾言。 – Alexander

回答

0

由於@BenjaminGruenbaum在

fetch已經返回骨幹承諾的評論說,沒有必要promisify它。

promisify只適用於有節點功能慣例

但獲取收益jqXHR,我想藍鳥承諾的功能,所以我需要使用Bluebird.resolve(),就是這樣。

所以我結束了這個

  Promise.resolve(diagram.fetch()) 
       .then(function (res) { 
        console.log('success'); 
       }) 
       .catch(() => { 
        console.error('fetch failed'); 
       });