jsonix
库不遵循first argument must be an error
惯例,所以我决定使用bluebird并像这样宣传:
return new Promise(function(resolve, reject) {
try {
unmarshaller.unmarshalString(xmlResponse,
function (unmarshalled) {
...
resolve(unmarshalled);
});
}
catch (error) {
reject(error);
}
});
但这无限期地挂起!然而,如果我只是将xmlResponse
保存到文件中,然后使用不同的方法处理它:unmarshalFile
...这种宣传似乎工作正常!
return new Promise(function(resolve, reject) {
try {
unmarshaller.unmarshalFile('test1.xml',
function (unmarshalled) {
...
resolve(unmarshalled);
});
}
catch (error) {
reject(error);
}
});
所以我的问题是为什么一种方法的宣传失败而另一种方法失败?
答案 0 :(得分: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);
}
或者,你可以使用Bluebird的Promise.method()
为你包装它:
return Promise.method(unmarshaller.unmarshalString.bind(unmarshaller, xmlResponse));
答案 1 :(得分:1)
免责声明:我是Jsonix的作者。
unmarshalURL
和unmarshalFile
是异步的(并且必须是),但unmarshalString
或unmarshalDocument
不是异步的(并且不必是)。< / p>