我对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代码?
答案 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);
});
对于你的问题:
then
函数一起返回。如果您向返回的Promise添加另一个then
,它将被添加到链的末尾。这就是我们在做test().then(...)
时所看到的。 returnPromise
中更详细地看到这一点。在这里,我们返回一个新的承诺。 Promise的主体在完成后调用resolve
方法(在这种情况下即刻),触发Promise来解析并执行链接到Promise的所有then
方法。通常,Promise不会立即解决,但会首先执行异步任务(例如,从服务器检索数据)。 答案 1 :(得分:1)
1)解析为db.post(person)
请求结果的承诺。
2)当then(...)
调用返回响应或抛出异常时,将执行传递给db.post()
的回调。
3)不知道。我不认为有一个普遍的答案。这取决于您要为此服务的用户提供的API。