0

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

所以我的问题是,为什么一种方法的承诺会失败,而另一种方法则不会?

4

2 回答 2

1

当我查看jsonix 的代码时,我看不到任何回调函数.unmarshalString()并且查看实现,实现中没有任何异步,也没有调用回调。它只是直接返回答案。因此,该函数是同步的,而不是异步的,并且直接将其值作为返回值返回。

作为参考,.unmarshalURL().unmarshalFile()接受回调并确实有一个异步实现 -.unmarshalString()只是不同。

所以,你根本不需要使用 Promise unmarshaller.unmarshalString(xmlResponse)。您可以只返回直接值:

return unmarshaller.unmarshalString(xmlResponse);

如果您想将其包装在所有三个方法之间接口一致性的承诺中,您可以这样做:

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

或者,您可以使用 BluebirdPromise.method()为您包装它:

return Promise.method(unmarshaller.unmarshalString.bind(unmarshaller, xmlResponse));
于 2016-09-14T22:16:48.630 回答
1

免责声明:我是Jsonix的作者。

unmarshalURL并且unmarshalFile是异步的(并且必须是)但unmarshalString或者unmarshalDocument不是异步的(并且不必是)。

于 2016-09-15T10:13:48.320 回答