我对 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);
});
对于您的问题:
- 您将 Promise 与所有链接的
then
函数一起返回。如果您向返回的 Promise 添加另一个then
,它将被添加到链的末尾。这就是您在执行test().then(...)
时看到的内容。 - Promise 告诉您它将在某个时间点执行,但没有告诉您何时执行。 Then 链将在 Promise 解析时执行。您可以在
returnPromise
中看到更详细的信息。这里我们返回一个新的 Promise。 Promise 的主体在完成时调用resolve
方法(在本例中是立即调用),触发 Promise 解析并执行链接到 Promise 的所有then
方法.通常 Promise 不会立即解析,而是会先执行异步任务(例如从服务器检索数据)。 - 这实际上取决于应用程序的类型和您要查找的内容。你现在的做法本身并没有什么不好,只要职责明确就行。
关于javascript - 从函数返回 promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40735418/