我是Node / Express的新手,正在尝试使用Promises执行对Apple的CloudKit JS API的连续API调用。
我不清楚如何依次放置函数并将它们各自的返回值从一个函数传递到下一个。
这是我到目前为止所拥有的:
var CloudKit = require('./setup')
//----
var fetchUserRecord = function(emailConfirmationCode){
var query = { ... }
// Execute the query
CloudKit.publicDB.performQuery(query).then(function (response) {
if(response.hasErrors) {
return Promise.reject(response.errors[0])
}else if(response.records.length == 0){
return Promise.reject('Email activation code not found.')
}else{
return Promise.resolve(response.records[0])
}
})
}
//-----
var saveRecord = function(record){
// Update the record (recordChangeTag required to update)
var updatedRecord = { ... }
CloudKit.publicDB.saveRecords(updatedRecord).then(function(response) {
if(response.hasErrors) {
Promise.reject(response.errors[0])
}else{
Promise.resolve()
}
})
}
//----- Start the Promise Chain Here -----
exports.startActivation = function(emailConfirmationCode){
CloudKit.container.setUpAuth() //<-- This returns a promise
.then(fetchUserRecord) //<-- This is the 1st function above
.then(saveRecord(record)) //<-- This is the 2nd function above
Promise.resolve('Success!')
.catch(function(error){
Promise.reject(error)
})
}
我在结尾处遇到错误:.then(saveRecord(record))
,它说record
未定义。我认为它将以某种方式从先前的承诺中退还。
似乎这应该比我做的要简单,但是我很困惑。当每一个都有不同的resolve
/ reject
结果时,如何使多个Promises像这样链接在一起?
答案 0 :(得分:4)
代码中几乎没有问题。
首先:您必须将函数传递给var x = randomString({
length: 8,
numeric: true,
letters: false,
special: false,
});
,但实际上您传递了函数调用的结果:
.then()
除.then(saveRecord(record))
以外,技术上可能还会返回一个函数,因此有可能使这样的语句有效,这似乎与您无关。所以你只需要
saveRecord(record)
另一个问题是.then(saveRecord)
和saveRecord
函数内部什么也不返回。
最后,您不需要从fetchUserRecord
内部返回包装器Promise.resolve
:您可以返回仅转换后的数据,它将通过链接向前传递。
.then
别忘了返回转换后的数据或新的承诺。否则var CloudKit = require('./setup')
//----
var fetchUserRecord = function(emailConfirmationCode){
var query = { ... }
// Execute the query
return CloudKit.publicDB.performQuery(query).then(function (response) {
if(response.hasErrors) {
return Promise.reject(response.errors[0]);
}else if(response.records.length == 0){
return Promise.reject('Email activation code not found.');
}else{
return response.records[0];
}
})
}
//-----
var saveRecord = function(record){
// Update the record (recordChangeTag required to update)
var updatedRecord = { ... }
return CloudKit.publicDB.saveRecords(updatedRecord).then(function(response) {
if(response.hasErrors) {
return Promise.reject(response.errors[0]);
}else{
return Promise.resolve();
}
})
}
//----- Start the Promise Chain Here -----
exports.startActivation = function(emailConfirmationCode){
return CloudKit.container.setUpAuth() //<-- This returns a promise
.then(fetchUserRecord) //<-- This is the 1st function above
.then(saveRecord) //<-- This is the 2nd function above
.catch(function(error){});
}
将返回到下一个链接函数。
答案 1 :(得分:0)
由于@skyboyer可以帮助我弄清楚发生了什么,因此我会将其答案标记为正确的答案。
由于我需要将返回的值传递给我的Promise链中的后续函数,因此我不得不进行一些微调。这是我结束的地方:
exports.startActivation = function(emailConfirmationCode){
return new Promise((resolve, reject) => {
CloudKit.container.setUpAuth()
.then(() => {
return fetchUserRecord(emailConfirmationCode)
})
.then((record) => {
resolve(saveRecord(record))
}).catch(function(error){
reject(error)
})
})
}