javascript - 链接 Promise 并在它们之间传递参数

标签 javascript promise cloudkit-js

我是 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 未定义。我以为它会以某种方式从之前的 promise 中得到返回。

看起来这应该比我做的更简单,但我很困惑。当每个 Promise 有不同的 resolve/reject 结果时,如何将多个 Promise 链接在一起?

最佳答案

代码中存在一些问题。

首先:您必须将函数传递给 .then() 但实际上传递了函数调用的结果:

.then(saveRecord(record))

除了 saveRecord(record) 从技术上讲可能会返回一个函数,因此有可能使这样的语句有效,但它似乎不符合您的情况。所以你只需要

.then(saveRecord)

另一个问题是 saveRecordfetchUserRecord 函数内部也没有返回任何内容。

最后,您不需要从 .then 内部返回包装器 Promise.resolve:您可以仅返回转换后的数据,并且它将通过链接向前传递。

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){});
}

不要忘记返回转换后的数据或新的 promise 。否则未定义将返回到下一个链式函数。

关于javascript - 链接 Promise 并在它们之间传递参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51955735/

相关文章:

javascript - agent.add 在 Promise.then 对话框流中不起作用

javascript - 拒绝带有错误的 Promise 时出现 TypeScript 错误 TS2345

ios - 我们可以为 Cloudkit JS 创建一个 API token ,无需身份验证即可访问共享数据吗

javascript - 检查属性是否未定义

javascript - 将分钟转换为小时 (H :mm) in MomentJS

javascript - 展开 JS 对象并转换数组

javascript - 嵌套的延迟 Q Promise 解析可以简化吗?

javascript - 为什么 (function(){return this}).bind ('abc' )()== ='abc' 等于 false?

node.js - 如何使用服务器到服务器 cloudkit.js 保存 Assets 字段记录