为什么Promisification失败了一些方法但不是全部?

时间:2016-09-14 19:13:34

标签: bluebird jsonix

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);
      }
    });

所以我的问题是为什么一种方法的宣传失败而另一种方法失败?

2 个答案:

答案 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的作者。

unmarshalURLunmarshalFile是异步的(并且必须是),但unmarshalStringunmarshalDocument不是异步的(并且不必是)。< / p>