javascript - 从函数返回 promise

标签 javascript angular typescript promise es6-promise

我对 JavaScript Promise 和 Promise 链的理解比较浅。 说,我有一个如下所示的方法。它是用 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  
    }); 
}

这里,我有两个return,第一个是

return this.db.find

哪个find函数是一个promise

then 链的末尾返回

return this.db.post(person)

甚至 post 功能也是一个 promise 。

这里,我有三个问题

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

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

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

最佳答案

首先,我认为您只需为自己制作一些小示例即可轻松测试我们的问题。当我不清楚事情是如何工作时,我发现创建一个小示例来尝试看看会发生什么非常有用。对于这个问题,我们也这样做(另请参阅 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 链将在 Promise 解析时执行。您可以在 returnPromise 中看到更详细的信息。这里我们返回一个新的 Promise。 Promise 的主体在完成时调用 resolve 方法(在本例中是立即调用),触发 Promise 解析并执行链接到 Promise 的所有 then 方法.通常 Promise 不会立即解析,而是会先执行异步任务(例如从服务器检索数据)。
  3. 这实际上取决于应用程序的类型和您要查找的内容。你现在的做法本身并没有什么不好,只要职责明确就行。

关于javascript - 从函数返回 promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40735418/

相关文章:

Angular : How to copy one array to another?

typescript - 添加基于另一个属性的额外类型属性

javascript - 如何在 HTML/JS 中创建悬停元素的可视选择标记?

javascript - 在 JS、CSS 和 HTML 之间显示/隐藏功能

javascript - 检查浏览器是否支持 WebGL 的 "Cheap"方法是什么? (使用JS)

Angular fire firestore 没有导出成员 'FirestoreSettingsToken'

Angular 2 innerHTML(点击)绑定(bind)

angular - 缺少必需的获取参数 Angular 4

javascript - 将 JavaScript 文件加载到另一个 JavaScript 文件中

angular - 如何在 Angular Firestore 中将日期保存为时间戳?