然后如何从承诺中获取错误结果

时间:2019-05-09 04:13:24

标签: javascript asynchronous ecmascript-6 promise

在答应结束时,我想调用一个期望使用$scope.getDetails = function() { MySvc.getDetails("abc").then(function(response){ console.log(response) // your details here }, function(error){ console.log(error.statusText); }); }; err参数的回调。像这样:

results

但是诺言不是那样的。

2 个答案:

答案 0 :(得分:0)

您可以尝试拒绝具有两个属性errorresults的对象。然后使用解构并调用callback,如下所示:

function callback(err, results) {
  console.log("error: ", err);
  console.log("result: ", results);
}

function async() {
  return Promise.reject({error: "your errors", results: "your results" });
}

async().catch(({error, results}) => callback(error, results));

但是请记住,resolve是您的成功结果,reject是您的错误。

答案 1 :(得分:0)

请注意(从经验中学到):混合使用Promise和回调时要小心。以后可能会使事情变得棘手。

但是,要确切地得到您想要的内容,您可以使用数组解析异步函数,然后使用数组解构将参数传递(有时称为“扩展”)到回调中:(如其他答案所示,对象销毁也是一种合理的选择)

function callback(err, results) {
  console.log("error: ", err);
  console.log("result: ", results);
}

function async() {
  return Promise.resolve(["your errors", "your results" ]);
}

async().then(([error, results]) => callback(error, results));

这可以满足您的要求,但是请务必注意此代码可能带来哪些问题。 async()函数将需要通过错误解决承诺来通过承诺链“打破规则”。 (“解决错误”和/或“拒绝良好结果”)。另外,该数组的顺序很重要。即使它是一个对象,诸如对象属性的正确拼写之类的简单事情(即“ err”属性还是“错误”)也可能引起问题。

此外,在回调函数中,可能有必要具有一些条件,以便在对结果进行任何处理之前先检查错误并进行处理。

但是,如果仅使用 个Promise,则可以对代码进行如下清理:

function async(){
  var err = 'sad face'; // Play with these vars to see what happens
  var results = 123;
  if( err ){
    return Promise.reject(err);
  } else {
    return Promise.resolve(results);
  }
}

async()
.then((resp) => { console.log(resp) /* Work with resp, no conditionals needed :) Merrily proceed with your remaining code */  })
.catch((err) => { console.error(err)/* Err occurred, handle it here */ })