可能未经处理的承诺拒绝

时间:2016-07-20 18:09:27

标签: javascript meteor promise ecmascript-6 es6-promise

我正在尝试拒绝承诺,正如我正在使用的框架API(Apollo堆栈)的文档中所解释的那样,但它没有显示示例,它只表明我必须拒绝承诺如果有错误,我试图在没有互联网连接的情况下尝试我的应用程序时,摆脱烦人的YellowBox消息“警告:可能无理由的拒绝承诺”。

我的方法实际上工作,它转到catch并显示错误消息,但我不断收到烦人的YellowBox消息,这就是我想要解决的问题。

我做的第一件事就是按预期进入捕获,但它显示了一个YellowBox消息Warning: Possible unhandled promise rejection...

return client.query({ query: gql`...`, }).then((data) => {
    console.log(data);
    data;
}).catch((error) => {
    console.log(error);
    error;
});

我尝试过的最后一件事:

var promise = new Promise(function(resolve, reject) {
  //async call, client.query(..) "returns a promise that should be rejected
  //if there is an error message..."
  client.query({ query: gql`...`, }).then(({data}) => {
    console.log(data);
    resolve(data);
  }).catch((error) => {
    console.log(error); // goes right here, works.
    reject(error.message);
  });
});
//just trying this out
promise.then((data) => {
  console.log(data);
}).catch((error) => {
  console.log(error); 
});

另外,添加标签Meteor因为找不到Apollo但是它几乎是一样的。

根据答案和评论中的建议尝试更多内容:

var promise = new Promise(function(resolve, reject) {
  client.query({
    query: gql`...`,
  }).then(({data}) => {
    console.log(data);
    resolve(data);
  }).catch((error) => {
    reject(error.message);
  });
}, (error) => {
  console.log(error);
});

另一:

var callback = {
  success: function(data) {
    console.log("SUCCESS");
  },
  error: function(data) {
    console.log("ERROR");
  }
};

var promise = new Promise(function(resolve, reject) {
  client.query({
    query: gql`...`,
  }).then(({data}) => {
    console.log(data);
    resolve(data);
  }).catch((error) => {
    console.log(error);
    reject(error.message);
  });
  return promise;
});
promise.then(callback.success, callback.error);

另一:

client.query({
  query: gql`...`,
}).then(({data}) => {
  console.log(data);
}, (error) => {
  console.log(error);
});

ApolloStack:http://docs.apollostack.com/apollo-client/network.html它说,如果发生错误,它会返回一个应该被拒绝的承诺。

YellowBox检测未处理的承诺和此类事情并抛出警告。

3 个答案:

答案 0 :(得分:1)

如果client.query为你做的话,没有理由创建一个承诺......

// no new Promise here, just make the query

return client.query({ query: gql`...`, }).then((data) => {
    console.log(data);
    data;
}).catch((error) => {
    console.log(error);
    error;
});

答案 1 :(得分:0)

发现问题,框架正在进行中,很快就会出现修复,所以目前还没有正确答案。

我将以正确的方式复制粘贴(如问题所示)。它也是从官方框架中复制而来的。文档显示了如何执行此操作,因此下一个遇到相同问题的人将会知道他们将需要等待几天才能解决问题。

client.query({ query: gql`...`, }).then((data) => {
    console.log(data);
}).catch((error) => {
    console.log(error);
});

答案 2 :(得分:-1)

尝试处理拒绝回调中的错误而不是catch回调:

var promise = new Promise(function(resolve, reject) {

    client.query({ query: gql`...`, }).then(({data}) => {
        console.log(data);
        resolve(data);
    }, (error)=>{
        console.log(error); // goes right here, works.
        reject(error.message);
    })
 });