Return 来自函数的承诺
Return promise from the function
对JavaScriptPromise和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
然后链的末尾returns
return this.db.post(person)
甚至post函数也是一个承诺。
这里,我有三个问题
1) 当这个函数执行时,会发生什么return?
2) 如果函数立即 return 承诺,链 然后 什么时候执行?
2) 在分层应用程序中重构承诺链的更好方法是什么。例如。很少有链 then 需要在服务中执行,其他需要在 UI 中执行,我如何构建我的承诺代码?
1) 解决 db.post(person)
请求结果的承诺。
2) 传递给then(...)
的回调在db.post()
调用returns响应或抛出异常时执行。
3) 不知道。我不认为有一个普遍的答案。这取决于您要向该服务的用户提供什么API。
首先,我认为您可以通过为自己制作一些小示例来轻松测试我们的问题。当我不清楚事情是如何工作时,我发现创建一个小示例来尝试看看会发生什么非常有用。让我们对这个问题也这样做(另请参阅 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);
});
您的问题:
- 您 return Promise 以及所有链接的
then
函数。如果您将另一个 then
添加到 returned Promise,它将被添加到链的末尾。这就是你在我们做 test().then(...)
时看到的。
- Promise 告诉您它将在某个时间点执行,但没有告诉您何时执行。 Then 链将在 Promise 解析时执行。您可以在
returnPromise
中看到更详细的信息。这里我们 return 一个新的 Promise。 Promise 的主体在完成时调用 resolve
方法(在本例中是立即调用),触发 Promise 解析并执行链接到 Promise 的所有 then
方法。通常 Promise 不会立即解析,而是会先执行异步任务(例如从服务器检索数据)。
- 这实际上取决于应用程序的类型和您要查找的内容。你现在的做法本身并没有什么不好,只要职责明确就行。
对JavaScriptPromise和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
然后链的末尾returns
return this.db.post(person)
甚至post函数也是一个承诺。
这里,我有三个问题
1) 当这个函数执行时,会发生什么return?
2) 如果函数立即 return 承诺,链 然后 什么时候执行?
2) 在分层应用程序中重构承诺链的更好方法是什么。例如。很少有链 then 需要在服务中执行,其他需要在 UI 中执行,我如何构建我的承诺代码?
1) 解决 db.post(person)
请求结果的承诺。
2) 传递给then(...)
的回调在db.post()
调用returns响应或抛出异常时执行。
3) 不知道。我不认为有一个普遍的答案。这取决于您要向该服务的用户提供什么API。
首先,我认为您可以通过为自己制作一些小示例来轻松测试我们的问题。当我不清楚事情是如何工作时,我发现创建一个小示例来尝试看看会发生什么非常有用。让我们对这个问题也这样做(另请参阅 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);
});
您的问题:
- 您 return Promise 以及所有链接的
then
函数。如果您将另一个then
添加到 returned Promise,它将被添加到链的末尾。这就是你在我们做test().then(...)
时看到的。 - Promise 告诉您它将在某个时间点执行,但没有告诉您何时执行。 Then 链将在 Promise 解析时执行。您可以在
returnPromise
中看到更详细的信息。这里我们 return 一个新的 Promise。 Promise 的主体在完成时调用resolve
方法(在本例中是立即调用),触发 Promise 解析并执行链接到 Promise 的所有then
方法。通常 Promise 不会立即解析,而是会先执行异步任务(例如从服务器检索数据)。 - 这实际上取决于应用程序的类型和您要查找的内容。你现在的做法本身并没有什么不好,只要职责明确就行。