从Javascript Promise链

时间:2018-04-02 19:20:31

标签: javascript node.js promise

现代JS /承诺新手在这里。尽管有关该主题的大量内容,但我很难找到一个简单问题的答案。

我相信我对JS Promises有一个很好的理解(感谢各种来源,包括mdn和https://spin.atomicobject.com/2016/02/16/how-javascript-promises-work/

我已经以最简单的形式定期使用和制作Promise,但是我继续使用以下模式绊倒我继承的项目中的方法:

const doAsyncOp = () => 
  $http.get(uri)
    .then(
      value => value,
      reject => //... 
    );

我的一个大问题是:当您只是从成功处理程序返回一个值时会发生什么?我需要使用这种方法,并且需要访问' value'在客户端代码中。这在技术上是不是处理?我应该重写实现吗?

3 个答案:

答案 0 :(得分:2)

  

我的一个大问题是:当您只是从成功处理程序返回一个值时会发生什么?

当您从.then()处理程序返回一个值时,该值将成为父承诺链的已解析值:因此,在此代码中:

// utility function that returns a promise that resolves after a delay
function delay(t, v) {
    return new Promise(resolve => {
        setTimeout(resolve.bind(null, v), t);
    });
}

function test() {
    return delay(100, 5).then(val => {
        // this return value becomes the resolved value of the promise chain
        // that is returned from this function
        return 10;
    });
}

test().then(result => {
    // logs 10
    console.log(result);
});

运行时,由于10处理程序中的return 10,它会记录.then()

.then()处理程序有四种可能性:

  1. 返回常规值,例如return 10return val。该值成为承诺链的已解决值。如果没有返回任何值(在Javascript中表示返回值为undefined),则承诺链的已解析值为undefined

  2. 返回最终解决或已经解决的承诺。此承诺已添加到链中,承诺链将采用该承诺的已解决值。

  3. 返回最终拒绝或已被拒绝的承诺。此承诺会添加到链中,承诺链会接受退回承诺的拒绝原因。

    < / LI>
  4. 抛出异常。如果在.then()处理程序中抛出异常,那么.then()基础结构将捕获它并将promise链变为拒绝将拒绝原因设置为抛出的值的状态。因此,如果您在throw new Error("User not found")处理程序中执行.then(),那么该拒绝链将被拒绝,并将该错误对象作为拒绝原因。

  5. 在您的特定代码中:

    const doAsyncOp = () => 
      $http.get(uri)
        .then(
          value => value,
          reject => //... 
        );
    

    value => value没有理由。 value已经是承诺的已解决价值,您无需再次设置它。

    由于胖箭头功能会自动返回任何单个语句,因此您已经在$http.get().then()函数中从doAsyncOp()返回了承诺。所以,你可以这样做:

    const doAsyncOp = () => $http.get(uri);
    
    doAsyncOp().then(result => {
       // handle the result here
    }).catch(err => {
       // handle error here
    });
    

答案 1 :(得分:1)

要获取客户端代码,只需从函数中返回 promise

const doAsyncOp = () => $http.get(uri)

然后在您的客户端中,您可以使用:

doAsyncOp()
.then(value => {
    // use value
}
.catch(err => { /* error */  }

答案 2 :(得分:0)

我认为您可以使用async并等待解析的值。

function delay(t, v) {
    return new Promise(resolve => {
        setTimeout(resolve.bind(null, v), t);
    });
}

async function(){
    await myData = delay(1000, 1000);

    console.log(myData);
}