javascript - 链接 Promise 并在它们之间传递参数
问题描述
我是 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
当每个 Promise 有不同的/结果时,如何让多个 Promise 像这样链接在一起reject
?
解决方案
代码中的问题很少。
首先:您必须将函数传递给,.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){});
}
不要忘记返回转换后的数据或新的承诺。否则undefined
将返回到下一个链式函数。
推荐阅读
- azure-devops - 我要创建的此任务组的自定义条件的正确语法是什么?
- python - 确定0和1的python列表中序列类型的最有效方法?
- javascript - JS SMTP 服务器需要安全连接或客户端未通过身份验证
- c++ - 查找两个区间之间的素数的函数
- arm - 在 Atmel Studio 中无法识别 Segger J-Link EDU Mini
- r - r - 在开始日期和结束日期之间生成累积和、总和和唯一标识符
- docker - 连接两个 docker 容器,然后使用 RESTful API 返回结果
- bash - 如何使用脚本杀死睡眠进程
- javascript - 内容不会在本机反应中滚动
- python - 如何在不达到递归限制的情况下使用子对象或邻居关系腌制 class() 对象并在加载时保留对象