从函数返回承诺

Sha*_*bir 2 javascript promise typescript es6-promise angular

我对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  
    }); 
}
Run Code Online (Sandbox Code Playgroud)

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

返回this.db.find

发现功能是一种承诺

然后结束链返回

返回this.db.post(人)

即使邮政功能也是一种承诺.

在这里,我有三个问题

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

2)如果函数立即返回promise,链接源何时执行?

2)在分层应用程序中重构promise链的更好方法是什么?如少数链需要在服务中执行,其他需要在UI执行,我该如何构建我的诺言代码?

Sjo*_*erd 8

首先,我认为您可以通过为自己制作一些小例子来轻松测试我们的问题.当我不清楚事情是如何工作的时候,我发现创建一个小例子来试试看看会发生什么是非常有用的.让我们也可以解决这个问题(另请参阅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);
});
Run Code Online (Sandbox Code Playgroud)

对于你的问题:

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