当函数需要访问外部范围变量时,更好的方法来处理Promise流

FXu*_*Xux 2 javascript node.js promise

我正在创建一个Node.js模块来与我的API进行交互,我使用superagent模块来执行请求.这个怎么运作:

module.exports = data => {
  return getUploadUrl()
    .then(uploadFiles)
    .then(initializeSwam)

  function getUploadUrl() {
    const request = superagent.get(....)
    return request
  }

  function uploadFiles(responseFromGetUploadUrl) {
    const request = superagent.post(responseFromGetUploadUrl.body.url)
    // attach files that are in data.files
    return request
  }

  function initializeSwam(responseFromUploadFilesRequest) {
    // Same thing here. I need access data and repsonseFromUploadFilesRequest.body
  }
}
Run Code Online (Sandbox Code Playgroud)

我觉得我做错了,但我想不出更好的方法来达到同样的效果.

Nor*_*ard 6

两种简单方法:

  1. 编写你的函数来获取它需要的所有参数

    const doStuff = data =>
      getUploadUrl()
      .then(uploadFiles)
      .then(initializeSwam)
    
    Run Code Online (Sandbox Code Playgroud)

    可能成为

    const doStuff = data =>
      getUploadUrl()
        .then(parseResponseUrl) // (response) => response.body.url
        .then(url => uploadFiles(data, url))
        .then(parseResponseUrl) // same function as above
        .then(url => initializeSwam(data, url))
    
    Run Code Online (Sandbox Code Playgroud)

这应该工作得很好(或者很好,取决于你在那些功能中挥手的东西).

  1. 部分应用你的功能

    const uploadFiles = (data) => (url) => {
      return doOtherStuff(url, data);
    };
    
    // same deal with the other
    const doStuff = data =>
      getUploadUrl()
        .then(parseResponseUrl)
        .then(uploadFiles(data)) // returns (url) => { ... }
        .then(parseResponseUrl)
        .then(initializeSwam(data));
    
    Run Code Online (Sandbox Code Playgroud)

所有这些技术(合理的时间和地点)的混合应该足以满足您的许多需求.