2016-09-14 66 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

相关问题