[英]Javascript how to chain multiple promises
在解析中,我有一個瘋狂的查詢,我在其中查詢table1以獲取對象。
然后在與table1的結果匹配的指針列上查詢所有匹配該表的用戶的table2。
接下來,我需要創建一個對象,然后使用該第一個對象的結果創建另一個對象。
最后,將最終對象從table2的查詢保存到用戶中。
我在鏈接所有內容時遇到問題,由於某種原因,在保存用戶對象之前會返回成功消息。
Parse.Cloud.define('startChain', (req, res) => {
let q1 = new Parse.Query("Table1");
q1.equalTo("objectId", req.params.q1ID);
q1.equalTo("user", req.user);
q1.include("user");
q1.get(req.params.q1ID)
.then(post => {
post.get("user")
.then(user => {
// Query on q1
let q2 = new Parse.Query("Table2");
q2.equalTo("t1Object", post);
w2.include("user2");
q2.include("pointer2Object");
q2.find();
})
.then(users => {
var morePromises = users.map(aUser => {
let newObject = new Parse.Object.Extend("Table3");
newObject.set("user", aUser);
newObject.set("table1Pointer", post);
newObject.save()
.then(result => {
var object2 = new Parse.Object.Extend("Table4");
object2.set("column1", aUser);
object2.set("column2", result);
var object3 = new Parse.Object.Extend("Table5");
object2.save()
.then(o2 => {
object3.set('column', 'o2');
object3.save()
.then(o3 => {
aUser.set("o3", o3);
return aUser.save(null, {useMasterKey: true});
});
});
});
});
Promise.all(morePromises)
.then(result => res.success());
})
.catch(err => {
res.error(err.message);
});
});
});
在第一行
q1.get(req.params.q1ID)
.then(post => {
then()
回調的參數是q1.get()
返回的q1.get()
。
按照相同的邏輯,您可以通過從鏈塊中返回下一個所需的內容,在單個級別(即不嵌套)上鏈接promise。 例如以上可以繼續像
q1.get(req.params.q1ID)
.then(post => {
...
return q2.find();
}).then( users => {
// users is available here
...
return object2.save();
}).then( o2 => {
});
依此類推...
理想情況下,您應該使用異步等待: https : //developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements/async_function
會更干凈,下面的代碼示例:
async function yourFunction(x) {
const result = await q2.find();
result.map((newObject) => {
await newObject.save();
});
}
不確定您的瀏覽器是否支持
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.