【问题标题】:Return promise from the function从函数返回承诺
【发布时间】:2017-04-05 17:57:20
【问题描述】:

我对 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  
    }); 
}

这里,我有两个返回,第一个是

返回 this.db.find

哪个find函数是一个promise

然后链结束返回

返回 this.db.post(person)

即使是 post 函数也是一个承诺。

在这里,我有三个问题

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

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

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

【问题讨论】:

    标签: javascript angular typescript promise es6-promise


    【解决方案1】:

    首先,我认为您只需为自己制作一些小示例即可轻松测试我们的问题。当我不清楚事情是如何工作的时,我发现创建一个小例子来尝试看看会发生什么非常有用。让我们对这个问题也这样做(另请参阅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. 这实际上取决于应用程序的类型和您正在寻找的内容。只要职责明确,您当前的方法本身就不错。

    【讨论】:

    • 我不确定我是否正确理解了您的论点。我相信执行者是function(resolve, reject) 部分。那里没有返回语句;它只调用resolve 方法。
    • 您能否举一个有效的 Plunker 示例,因为我仍然不确定您的意思。如果你想链接thens,你可以从你的then 中返回新的 Promise。 MDN 文本解释说,您可以构造一个新的 Promise 来解析,或者只返回任何值(然后将自动包装在 Promise 中并为您解析)。保留 return 语句也不允许您将信息从 then 传递到 then
    • 哇,我不知道您可以“返回任何值(然后将自动包装在 Promise 中并为您解决)”。你是绝对正确的。我会删除我困惑的 cmets。
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-17
      • 1970-01-01
      • 1970-01-01
      • 2019-01-23
      • 2020-08-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多