从函数返回承诺

时间:2016-11-22 06:46:03

标签: javascript angular typescript promise es6-promise

我对JavaScript承诺和承诺链有一个浅薄的理解。 说,我有一个方法如下所示。它的编写是TypeScript,但可以修改以匹配JavaScript ES6

private InsertPersonInDB(p : Person) {    
     return this.db.find({                              //<- would this return?
                selector: {objType: 'Person'},
                fields: ['_id'],
                sort: ['_id']
            }).then( result => {                         
                let allpersondIds : string[] = [];
                (result.docs).forEach(rec => {
                    allpersondIds.push(rec._id);
                });
                return allpersondIds;                
            }).then ( allpersonIdsInDB => {                
                var id = this.getIdfromPersonName(person.personName, allpersonIdsInDB);
                person._id = id;
                return this.db.post(person)            //<- or would this return?
            }
}

//Calling function
for(let person of this.persons) {
    InsertPersonInDB(person).then(result => {
        console.log(result)
        //Some UI updates       
    }).catch(err => {
        console.log(err)
        //Some UI updates notifying user about failure  
    }); 
}

在这里,我有两个回归,第一个是

  

返回this.db.find

找到函数是一个承诺

然后链接的结束返回

  

返回this.db.post(person)

即使帖子功能也是一种承诺。

在这里,我有三个问题

1)当这个函数执行时,会返回什么?

2)如果函数立即返回promise,那么链 thens 何时执行?

2)在分层应用程序中重构promise链的更好方法是什么。例如。很少有链然后需要在服务中执行,其他需要在UI中执行,我如何构建我的promises代码?

2 个答案:

答案 0 :(得分:6)

首先,我认为您可以通过为自己制作一些小例子来轻松测试我们的问题。当我不清楚事情是如何工作的时候,我发现创建一个小例子来试试看看会发生什么是非常有用的。让我们也为这个问题做同样的事情(请参阅https://plnkr.co/edit/K18o4Lp2jtUincjyG5wi?p=preview了解工作版本;打开控制台查看结果!):

function test() {
  return returnPromise().then((value) => {
    console.log('1st then, inside test(): ' + value);
    return 'Hello';
  }).then((value) => {
    console.log('2nd then, inside test(): ' + value);
    return 'world';
  });
}

function returnPromise() {
  return new Promise(function(resolve, reject) {
    resolve('start of new Promise');
  });
}

test().then((value) => {
  console.log('3rd then, after calling test: ' + value);
});

对于你的问题:

  1. 您将Promise与所有链式then函数一起返回。如果您向返回的Promise添加另一个then,它将被添加到链的末尾。这就是我们在做test().then(...)时所看到的。
  2. 承诺告诉你它会在某个时间点执行,而不会告诉你什么时候。只要Promise结算,then链就会执行。您可以在returnPromise中更详细地看到这一点。在这里,我们返回一个新的承诺。 Promise的主体在完成后调用resolve方法(在这种情况下即刻),触发Promise来解析并执行链接到Promise的所有then方法。通常,Promise不会立即解决,但会首先执行异步任务(例如,从服务器检索数据)。
  3. 这实际上取决于应用程序的类型以及您要查找的内容。只要责任​​明确定义,您当前的方法本身并不坏。

答案 1 :(得分:1)

1)解析为db.post(person)请求结果的承诺。

2)当then(...)调用返回响应或抛出异常时,将执行传递给db.post()的回调。

3)不知道。我不认为有一个普遍的答案。这取决于您要为此服务的用户提供的API。