调用返回promises的函数更清晰

时间:2016-08-11 20:16:07

标签: javascript node.js promise

我有两个被调用的函数返回promises,我想通过catch语句捕获错误来使它更清晰。

我认为我正在以正确的方式进行,尽管代码以异步方式正确调用函数。

这些是我的电话:

// The text is hopefully the email address and the pin number
fb.verifyEmailPin(text).then(function(reply){

    // Set the new state to 'get_city'
    fb.setState(FB_ID).then(function(result){  


    }).catch(function(v) {
      // Rejection
        // If there was an error then prompt the user to enter again
    }); // setState

}).catch(function(err){

});// verifyEmailPin

这是实际的函数 - 对于setState,我还没有为verifyEmailPin函数编写代码,但它在回传解析或拒绝方面遵循与设置状态相同的结构。

/*
* Function : setState
* Purpose  : Set the state to what every is send in on the parameter
*/
exports.setState = function(fbid,newstate){

  var success = 'Y';
  return new Promise((resolve, reject) => {

    client.hmset(fbid, { 'state': newstate });

    // Check that we have set it ok
    client.hmget(fbid,'state',function(err,reply){

      if (err || reply != newstate) {
           return reject(err);
      }

        return resolve(success);

    });


  }).catch(function(v) {

  });

 } 

1 个答案:

答案 0 :(得分:2)

最后只能使用一个.catch。为了减少缩进,你可以链接.then。如果你在之后做异步,那么 -functions确保返回一个promise,否则以下的thens将不会等待它的完成。在同步操作上(例如somePromise.then(JSON.parse).then(...)),不需要承诺。

这是一个简短的例子:

function promiseTest(x) {
    Promise.resolve(x).then(function(a) { // instead of Promise.resolve do something asynchronous, e.g. an ajax call that returns a promise
        if (typeof x != "number") throw "NaN";
        return a*2;
    }).then(function(a) {
        console.log(a);
    }).catch(function(err) {
        console.error("error in promise:", err);
    })
}
promiseTest(1); //logs 2 to the console
promiseTest("a"); // shows error message in the console

如果你想并行运行几个异步操作并等待所有这些操作完成,你可以使用Promise.all为它提供一组promises。

Promise.all([doSomethingAsyncAndReturnPromise(), somethingElseAsync()]).then(function results) {
    // results[0] contains the result from doSomethingAsyncAndReturnPromise
    // results[1] contains the result from somethingElseAsync
});