Javascript 从函数返回承诺

Javascript 从函数返回承诺,javascript,angular,typescript,promise,es6-promise,Javascript,Angular,Typescript,Promise,Es6 Promise,我对JavaScript承诺和承诺链有一个肤浅的理解。 比如,我有一个如下所示的方法。它是用TypeScript编写的,但可以修改以匹配JavaScript ES6 private InsertPersonInDB(p : Person) { return this.db.find({ //<- would this return? selector: {objType: 'Pers

我对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  
    }); 
}
private InsertPersonInDB(p:Person){
返回这个.db.find({/{
让AllPersondId:string[]=[];
(result.docs).forEach(rec=>{
所有人员id推送(记录id);
});
返回所有persondids;
}).then(allpersonIdsInDB=>{
var id=this.getIdfromPersonName(person.personName,allpersonIdsInDB);
个人。_id=id;
返回此.db.post(个人)//{
console.log(结果)
//一些UI更新
}).catch(错误=>{
console.log(错误)
//一些UI更新通知用户失败
}); 
}
在这里,我有两个回报,第一个是

返回this.db.find

哪个函数是承诺

然后链的末端返回

返回此.db.post(个人)

即使是post功能也是一种承诺

在这里,我有三个问题

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

2) 如果函数立即返回承诺,那么链将在何时执行

2) 有什么更好的方法可以重构分层应用程序中的承诺链。例如,少数承诺链需要在服务中执行,其他承诺链需要在UI中执行,我如何构造我的承诺代码?

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

2) 传递给
然后(…)
的回调在
db.post()
调用返回响应或引发异常时执行


3) 不知道。我不认为有一个笼统的答案。这取决于你想为这项服务的用户提供什么样的API。

首先,我认为你可以简单地为自己做一些小例子来测试我们的问题。当我不清楚事情是如何运作的时候,我发现创建一个小例子来尝试你的想法是非常有用的t,看看会发生什么。让我们对这个问题也这样做(另请参见工作版本;打开控制台查看结果!):

关于您的问题:

  • 将承诺与所有链接的
    then
    函数一起返回。如果将另一个
    then
    添加到返回的承诺中,它将添加到链的末尾。这就是我们在执行
    test()时看到的。然后(…)
  • 承诺告诉您它将在某个时间点执行,而不告诉您何时执行。然后链将在承诺解析时执行。您可以在
    returnPromise
    中看到更详细的内容。这里我们返回一个新的承诺。承诺主体在完成时调用
    resolve
    方法(在本例中是即时的),触发承诺解析并执行所有链接到承诺的
    ,然后执行
    方法。通常承诺不会立即解析,但会首先执行异步任务(例如从服务器检索数据)
  • 这实际上取决于应用程序的类型和您正在寻找的内容。只要职责明确,您当前的方法本身就不错

  • 我不确定我是否正确理解了你的论点。我相信执行者是
    函数(resolve,reject)
    part。其中没有返回语句;它只调用
    resolve
    方法。您能否给出一个有效的Plunker示例,因为我仍然不确定您的意思。如果您想链接
    然后
    s,您可以从
    然后
    中返回新的承诺。MDN文本说明您可以构建一个新的Promise解析,或者只返回任何值(然后将自动包装在承诺中并为您解析)。保留返回语句也不允许您将信息从
    然后
    传递到
    然后
    。哇,我不知道您可以“返回任何值”(这将自动包装在一个承诺中,并为您解决)”。您完全正确。我将删除我混乱的评论。
    
    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);
    });