2016-09-14 65 views
0

jsonix庫不遵循first argument must be an error約定,所以我決定用藍鳥和promisify它像這樣:Promisification爲什麼會失敗的一些方法,但不是全部?

return new Promise(function(resolve, reject) { 
     try { 
     unmarshaller.unmarshalString(xmlResponse, 
      function (unmarshalled) { 
      ... 
      resolve(unmarshalled); 
      }); 
     } 
     catch (error) { 
     reject(error); 
     } 
    }); 

但這個無限期掛起!而如果我只是將xmlResponse保存到一個文件,然後用不同的方法處理它:unmarshalFile ... promisification似乎工作得很好!

return new Promise(function(resolve, reject) { 
     try { 
     unmarshaller.unmarshalFile('test1.xml', 
      function (unmarshalled) { 
      ... 
      resolve(unmarshalled); 
      }); 
     } 
     catch (error) { 
     reject(error); 
     } 
    }); 

所以我的問題是爲什麼promisification會失敗的一種方法,但不是另一種?

回答

1

當我看着the code for jsonix,我沒有看到.unmarshalString()的任何回調函數,看着實現,沒有什麼異步的執行和沒有調用回調。它只是直接返回答案。所以,該函數是同步的,而不是異步的,並直接返回它的值作爲返回值。

僅供參考,.unmarshalURL().unmarshalFile()確實接受回調並確實有異步執行 - .unmarshalString()只是不同。

所以,你根本不需要使用承諾unmarshaller.unmarshalString(xmlResponse)。你可以只返回直值:如果你想將它包裝在所有三種方法之間接口的一致性承諾

return unmarshaller.unmarshalString(xmlResponse); 

,你可以這樣做:

try { 
    return Promise.resolve(unmarshaller.unmarshalString(xmlResponse)); 
} catch(err) { 
    return Promise.reject(err); 
} 

或者,你可以使用藍鳥的Promise.method()到它包起來嗎:

return Promise.method(unmarshaller.unmarshalString.bind(unmarshaller, xmlResponse)); 
1

免責聲明:我的Jsonix作者。

unmarshalURLunmarshalFile是異步(並且必須是),但unmarshalStringunmarshalDocument不是異步(並且不必是)。

+0

謝謝你的分享,現在我只是覺得... dum da dum dum DUMB! – pulkitsinghal

相關問題